Spring 使用持久订阅者的批量分区作业
Spring Batch Partitioned Job Using Durable Subscriber
我们在 10 个服务器 JBoss EAP 5.2 集群中使用 Spring 作业的批处理和分区。由于 JBoss 消息传递中的一个问题,我们需要使用一个主题作为来自分区步骤的回复消息。一切正常,直到我们看到 JBoss 消息故障(在启动作业的服务器上)并将其从集群中删除。它会恢复,但主分区不会接收从分区步骤发送的消息。我在 JMX 控制台的主题中看到消息,但也看到订阅和消息是非持久的。因此,我想将分区步骤回复的通信变成持久订阅。我似乎无法通过文件方式来做到这一点。这是我当前对分区步骤和关联 bean 的配置。
入站网关配置
<int:channel id="springbatch.slave.jms.request"/>
<int:channel id="springbatch.slave.jms.response" />
<int-jms:inbound-gateway
id="springbatch.master.inbound.gateway"
connection-factory="springbatch.listener.jmsConnectionFactory"
request-channel="springbatch.slave.jms.request"
request-destination="springbatch.partition.jms.requestsQueue"
reply-channel="springbatch.slave.jms.response"
concurrent-consumers="${springbatch.partition.concurrent.consumers}"
max-concurrent-consumers="${springbatch.partition.concurrent.maxconsumers}"
max-messages-per-task="${springbatch.partition.concurrent.maxmessagespertask}"
reply-time-to-live="${springbatch.partition.reply.time.to.live}"
/>
出站网关配置
<int:channel id="jms.requests">
<int:dispatcher task-executor="springbatch.partitioned.jms.taskExecutor" />
</int:channel>
<int:channel id="jms.reply" />
<int-jms:outbound-gateway id="outbound-gateway"
auto-startup="false" connection-factory="springbatch.jmsConnectionFactory"
request-channel="jms.requests"
request-destination="springbatch.partition.jms.requestsQueue"
reply-channel="jms.reply"
reply-destination="springbatch.partition.jms.repliesQueue"
correlation-key="JMSCorrelationID">
<int-jms:reply-listener />
</int-jms:outbound-gateway>
</code>
进一步补充迈克尔的评论;目前无法为 <reply-listener/>
配置主题 - 在 request/reply 场景中使用主题是相当不寻常的,我们没有预料到这种要求。
随意开一个JIRA Issue against Spring Integration。
另一种方法是为请求输入 outbound-channel-adapter,为回复输入 inbound-channel-adapter。但是,这样做时需要对 replyChannel
header 进行一些特殊处理 - 请参阅 the docs here for more information about that.
我们在 10 个服务器 JBoss EAP 5.2 集群中使用 Spring 作业的批处理和分区。由于 JBoss 消息传递中的一个问题,我们需要使用一个主题作为来自分区步骤的回复消息。一切正常,直到我们看到 JBoss 消息故障(在启动作业的服务器上)并将其从集群中删除。它会恢复,但主分区不会接收从分区步骤发送的消息。我在 JMX 控制台的主题中看到消息,但也看到订阅和消息是非持久的。因此,我想将分区步骤回复的通信变成持久订阅。我似乎无法通过文件方式来做到这一点。这是我当前对分区步骤和关联 bean 的配置。
入站网关配置
<int:channel id="springbatch.slave.jms.request"/>
<int:channel id="springbatch.slave.jms.response" />
<int-jms:inbound-gateway
id="springbatch.master.inbound.gateway"
connection-factory="springbatch.listener.jmsConnectionFactory"
request-channel="springbatch.slave.jms.request"
request-destination="springbatch.partition.jms.requestsQueue"
reply-channel="springbatch.slave.jms.response"
concurrent-consumers="${springbatch.partition.concurrent.consumers}"
max-concurrent-consumers="${springbatch.partition.concurrent.maxconsumers}"
max-messages-per-task="${springbatch.partition.concurrent.maxmessagespertask}"
reply-time-to-live="${springbatch.partition.reply.time.to.live}"
/>
出站网关配置
<int:channel id="jms.requests">
<int:dispatcher task-executor="springbatch.partitioned.jms.taskExecutor" />
</int:channel>
<int:channel id="jms.reply" />
<int-jms:outbound-gateway id="outbound-gateway"
auto-startup="false" connection-factory="springbatch.jmsConnectionFactory"
request-channel="jms.requests"
request-destination="springbatch.partition.jms.requestsQueue"
reply-channel="jms.reply"
reply-destination="springbatch.partition.jms.repliesQueue"
correlation-key="JMSCorrelationID">
<int-jms:reply-listener />
</int-jms:outbound-gateway>
</code>
进一步补充迈克尔的评论;目前无法为 <reply-listener/>
配置主题 - 在 request/reply 场景中使用主题是相当不寻常的,我们没有预料到这种要求。
随意开一个JIRA Issue against Spring Integration。
另一种方法是为请求输入 outbound-channel-adapter,为回复输入 inbound-channel-adapter。但是,这样做时需要对 replyChannel
header 进行一些特殊处理 - 请参阅 the docs here for more information about that.