【发布时间】:2016-02-16 23:28:01
【问题描述】:
我在我的应用程序中使用 spring DMLC,设置如下进一步分析,我发现这 10 个确认没有发回,这就是为什么我可以在服务器上看到它们,几分钟后发回确认但速度很慢。
进一步说,我在 CachingConnectionFactory 中尝试了cacheConsumers=false,一切都变得很好,但是这使得频繁绑定/取消绑定到 mq 服务器并在 jmv 中创建巨大的消费者对象,有没有人有任何解决方案来解决这个问题,保持 cacheConsumers=true ?
<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="cachingjmsQueueConnectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="queueDestination" />
<property name="concurrency" value="10-10" />
<property name="cacheLevel" value="1" />
<property name="transactionManager" ref="dbTransactionManager" />
<property name="sessionTransacted" value="true" />
</bean>
<bean id="cachingjmsQueueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jmsQueueConnectionFactory" />
<property name="reconnectOnException" value="true" />
<property name="cacheConsumers" value="true" />
<property name="cacheProducers" value="true" />
<property name="sessionCacheSize" value="1" />
</bean>
【问题讨论】:
-
实际的
jmsConnectionFactory是什么?另外,您为什么要使用CachingConnectionFactory并在 DMLC 上进行缓存?使用直接jmsConnectionFactory并将cacheLevel设置为3。通常在事务环境(尤其是 JTA)中,缓存会破坏事情,尤其是在缓存消费者时。 -
jmsConnectionFactory是由 solace lib 提供的 connectionfactory 对象,它工作正常,我检查了一下。如果我选择cacheLevel=3,我会看到同样的问题,所以尽管将其缓存在CachingConnectionFactory中。是的,它似乎破坏了我的应用程序,有什么解决方案可以让它变得更好吗? -
在使用
transactionManager时,我们在使用 DLMC 缓存消费者时遇到问题,因此我们只缓存会话,而其他所有内容(生产者和消费者)都会重新创建。 -
我看到您的并发配置是
"10-10",但是当使用可变容器并发时,您应该永远在 CCF 中缓存消费者 - 否则当工作人员数量减少时,消费者放入缓存中,没有从该消费者获取任何内容,因此您看到的行为就是随后发生的事情 - 代理认为缓存的消费者是活动的。 DLMC 消费者通常寿命较长,因此您不应看到大量消费者创建。 -
不建议将缓存消费者保留在具有可变并发性的 DMLC 中,因此我将其固定为 10-10,我也没有在 DMLC 中缓存消费者,而是在 CCF 中缓存消费者,但是我看到你提到的有点相同的问题以上,有解决办法吗? @M Deinum 提到的事务管理器真的有问题吗?没有人解决这个问题?
标签: java spring jms spring-jms solace