【发布时间】:2013-01-01 06:50:02
【问题描述】:
一位客户使用这种模式:
- Apache Camel 和 CXF JMS 接收器
- 这些内部使用 Spring MDP(消息驱动 POJO)来实现其消息接收器
- 它们部署在 IBM WebSphere Application Server 7 上
- 队列管理器是 IBM Websphere MQ 6
- Spring MDP 使用 JNDI 队列连接工厂绑定到队列管理器 - 支持连接池和会话池
这是一个这样的消息接收器的例子,这个是使用骆驼的:
<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 异步实现真的是一种轮询机制吗?如果是这样,有没有办法限制队列管理器的行程?也许增加轮询间隔?任何见解将不胜感激。
【问题讨论】:
-
您的 JMS 配置看起来不错。那里没有任何东西可以阻止听众作为听众工作。你能发布你的骆驼路线/配置吗?
-
路线中会针对这个问题寻找什么?回复:“那里没有任何东西会阻止听众作为听众工作。” -- 会知道在哪里可以找到有关 MDP“侦听器”内部的文档。我很担心,因为线程中有一个(可能被误导的)答案:stackoverflow.com/questions/7390286/…。这表明 MDP 侦听器在 QCF 上的行为是轮询 - 与 MDB 相比,可能不是真正的异步侦听器。我希望轮询应用程序不断请求 MGET。
-
稍后进行一些研究,阅读我的答案。不是 100% 确定,但至少可以从某个地方开始寻找。
-
谢谢!感谢您抽出宝贵的时间进行研究。我将根据您提供的内容进一步深入研究。
标签: cxf apache-camel ibm-mq websphere-7 spring-jms