Spring集成服务 - 接口网关回复通道作为共享Pub / Sub

时间:2015-02-26 13:19:51

标签: spring spring-integration gateway

这与Intermittent BridgeHandler & PublishSubscribeChannel call when gateways' reply channel is pub/sub类似,但情况不同,因为回复频道没有“丢失”。问题是我的方案的最佳分辨率是什么。

我正在使用Spring集成来启动Spring批处理作业。我有很多输入路线,例如文件轮询和http请求。这些都路由到batch-int Job Launching Gateway。引用的Job Launcher有一个任务执行程序,因此作业启动是异步的。该网关在指定的频道上回复。

<int:gateway service-interface="c.c.c.etl.gateway.JobSubmissionService" id="jobSubmissionService" default-request-channel="jobLauchInputChannel" default-reply-channel="jobLaunchReplyChannel">
</int:gateway>

<int:bridge id="filePollerBridge" input-channel="filePollerOutputChannel" output-channel="jobLauchInputChannel" />

<batch-int:job-launching-gateway request-channel="jobLauchInputChannel" reply-channel="jobLaunchReplyChannel" job-launcher="jobLauncher">
</batch-int:job-launching-gateway>

<int:publish-subscribe-channel id="jobLaunchReplyChannel" />

<int:bridge id="jobLaunchReplyChannelBridge" input-channel="jobLaunchReplyChannel" output-channel="loggingChannel">
</int:bridge>

此指定频道'jobLaunchReplyChannel'是pub / sub,并且有一个记录器正在侦听它。此通道还用作服务接口网关的回复通道。

我遇到的问题是,当通过不是网关的源(例如轮询器)请求作业时,由网关添加的Bridge会引发异常,因为没有在回复上设置回复通道。

我已经通过为通过网关发送的邮件添加标头并将仅使用此标头的邮件过滤到新的“gatewayReplyChannel”来解决此问题。

<int:gateway service-interface="c.c.c.etl.gateway.JobSubmissionService" id="jobSubmissionService" default-request-channel="httpJobRequestInputChannel" default-reply-channel="jobSubmissionServiceReplyChannel">
  <int:default-header name="isJobSubmissionServiceMessage" value="true" />
</int:gateway>

<int:channel id="jobSubmissionServiceReplyChannel"></int:channel>

<int:filter id="jobSubmissionServiceReplyChannelFilter" input-channel="jobLaunchReplyChannel" expression="headers.get('isJobSubmissionServiceMessage') == null ? false : headers.get('isJobSubmissionServiceMessage')" output-channel="jobSubmissionServiceReplyChannel"
throw-exception-on-rejection="false" />

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

呃......这是一个有趣的问题。主要原因是MessagingGatewaySupport为内部replyMessageCorrelator创建BridgeHandler端点。

当我们直接向reply-channel发送消息时,我们确实有这种奇怪的行为。 BridgeHandler尝试从标题中向replyChannel发送消息。

我们真的无法阻止这种逻辑。并且无法保护明确的reply-channel免受直接消息的影响。

我认为您的解决方案是正确的。解决这个问题的另一种方法是:从另一个流的开头添加replyChannel标头(在你的情况下进行文件轮询),只需使用以下内容:

<header-enricher>
  <reply-channel ref="nullChannel"/>
</header-enricher>

随意就此问题提出JIRA问题,我们会看看我们能做些什么。至少我们可以记录这些细节。