客户使用此模式:
- Apache Camel 和 CXF JMS 接收器
- 这些在内部使用 Spring MDP(消息驱动 POJO)来实现它们的消息接收器
- 它们部署在 IBM WebSphere Application Server 7 上
- 队列管理器是 IBM Websphere MQ 6
- Spring MDP 使用 JNDI 队列连接工厂绑定到队列管理器——支持连接池和会话池
这是此类消息接收器的示例,此示例使用的是 Camel:
<bean id="ibmmq" class="org.apache.camel.component.jms.JmsComponent">
<property name="configuration" ref="jmsConfig"/>
</bean>
<!-- JNDI reference to the queue manager -->
<jee:jndi-lookup id="myTargetConnectionFactory" jndi-name="${mq.queueconnectionfactory}"/>
<bean id="jmsDestResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"/>
<bean id="myConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="myTargetConnectionFactory"/>
<property name="username" value="SOME_USER"/>
<property name="password" value=""/>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="${mq.connectionfactorybean}" />
<property name="destinationResolver" ref="jmsDestResolver" />
<property name="concurrentConsumers" value="1" />
<property name="maxConcurrentConsumers" value="1" />
<!--
NOTE: If we try to use a cache without a transactionManager we get "Connection closed" errors
-->
<property name="cacheLevelName" value="CACHE_NONE" />
</bean>
问题: WebSphere MQ 管理员向队列管理器报告了更多的 MGET() 请求。目前的假设是那些接收者不断地轮询频道以获取新消息。
他们似乎对 MDB(消息驱动 bean)没有这个问题。MDP 异步实现真的是一种轮询机制吗?如果是这样,有没有办法限制队列管理器的行程?也许增加轮询间隔?任何见解将不胜感激。