此问题最初在此处讨论过:
Partitioned jobs using reply destination
但是,我想澄清我所看到的。首先,这适用于在多服务器群集上运行40多个分区作业的系统。入站网关的配置现在是:
<int-jms:inbound-gateway id="springbatch.inbound.gateway"
connection-factory="springbatch.jmsConnectionFactory"
request-channel="springbatch.slave.jms.request"
request-destination="requestsQueue"
reply-channel="springbatch.slave.jms.response"
concurrent-consumers="2"
max-concurrent-consumers="2"/>
出站网关是:
<int-jms:outbound-gateway
id="outbound-gateway-1"
auto-startup="false"
connection-factory="jmsConnectionFactory"
request-channel="partitioned.jms.requests"
request-destination="jms.requestsQueue"
reply-channel="partitioned.jms.reply"
reply-destination="jms.repliesQueue"
correlation-key="JMSCorrelationID">
<int-jms:reply-listener/>
</int-jms:outbound-gateway>
然后我添加了一个作业监听器来启动和停止作业启动和停止时的出站网关。当我启动系统时,JBoss JMX控制台显示请求队列中有2个使用者,并且响应队列中没有消费者按预期方式。
当分区作业启动时,作业侦听器会在网关上调用start,并将其视为处理程序。然后还添加了另一个处理程序(来自BridgeHandler
的{{1}}),并且回复队列现在在回复队列上显示2个消费者。消息被发送,处理,响应返回,并由网关回复侦听器拾取并且作业完成。侦听器然后在网关上调用stop并将其作为处理程序删除。回复队列仍然有一个额外的消费者。
如果我尝试再次运行分区作业,则侦听器会在网关上调用start,并且在回复队列中有2个使用者。消息被发送,处理,返回响应。消息显示在回复队列中,但它们从未被拾取并且作业挂起。
因此,似乎停止和启动出站网关可能还不够。
由于
答案 0 :(得分:0)
答案 1 :(得分:0)
我查看了您的测试用例,发现连接工厂结构存在差异。我的配置是通过以下方式创建连接工厂:
<jee:jndi-lookup id="springbatch.jmsConnectionFactory" jndi-name="${connectionFactoryName}"/>>
当我从测试用例更改为配置时:
<jee:jndi-lookup id="jboss.jmsConnectionFactory" jndi-name="${connectionFactoryName}"/>
<bean id="springbatch.jmsConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="springbatch.jboss.jmsConnectionFactory"/>
<property name="sessionCacheSize" value="10" />
<property name="cacheProducers" value="true" />
<property name="cacheConsumers" value="false" />
</bean>
现在我看到了初步测试中处理的消息。所以我猜这个问题是消费者的缓存。问题是jms连接工厂的正确配置是什么。引用app服务器的jms连接有两个选项:
Spring有3个选项:
在这6个选项中,最佳配置是什么?为什么?