Java 为什么邮件会卡在solace服务器上?

Java 为什么邮件会卡在solace服务器上?,java,spring,jms,spring-jms,solace,Java,Spring,Jms,Spring Jms,Solace,我在我的应用程序中使用的spring DMLC具有以下设置,我在DMLC中面临着奇怪的行为,如果我在侦听器队列中发送1000条消息,~1990到达DMLC的速度非常快,~10卡在服务器上,进一步分析后,我发现这10条消息的确认不会被发送回去,这就是为什么我可以在服务器上看到它们,几分钟后,ACK返回,但速度非常慢 在此基础上,我在CachingConnectionFactory中尝试了cacheConsumers=false,一切都变好了,但是这会频繁绑定/取消绑定到mq服务器,并在jmv中创建

我在我的应用程序中使用的spring DMLC具有以下设置,我在DMLC中面临着奇怪的行为,如果我在侦听器队列中发送1000条消息,~1990到达DMLC的速度非常快,~10卡在服务器上,进一步分析后,我发现这10条消息的确认不会被发送回去,这就是为什么我可以在服务器上看到它们,几分钟后,ACK返回,但速度非常慢

在此基础上,我在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>

您可以在cachingConnectionFactory中将cacheConsumer设置为false,也可以在DefaultMessageListenerClass上将cacheLevel更改为level 3(CACHE\u CONSUMER)。通过这种方式,使用者将在DMLC级别缓存,并且应该在不频繁绑定/取消绑定的情况下解决消息被卡住的问题

cacheConsumer应该设置为false,您应该让DefaultMessageListenerClasse控制缓存,因为最好让侦听器容器在其生命周期内处理适当的缓存。Spring文档()中的以下注释讨论了这一点:

注意:请勿将Spring的CachingConnectionFactory与 动态缩放。理想情况下,不要将其用于消息侦听器 容器,因为通常最好让侦听器 容器本身在其生命周期内处理适当的缓存。 此外,停止和重新启动侦听器容器仅适用于 一个独立的、本地缓存的连接-不与外部 缓存一个


实际的
jmsConnectionFactory
是什么?另外,为什么要在DMLC上使用
CachingConnectionFactory
和缓存?使用直接
jmsConnectionFactory
并将
cacheLevel
设置为
3
。通常在事务性环境(尤其是JTA)中,缓存会破坏一些东西,尤其是在缓存消费者时。
jmsConnectionFactory
是solace lib提供的connectionfactory对象,它工作正常,我检查过了。如果我使用
cacheLevel=3
,我可以看到同样的问题,因此可以将其缓存在
CachingConnectionFactory
中。是的,它似乎破坏了我的应用程序,有什么解决方案可以让它更好吗?我们在使用
transactionManager
时,在DLMC中缓存使用者时遇到了问题,因此我们只缓存会话,其他一切(生产者和使用者)都会重新创建。我看到您的并发配置是
“10-10”
但是在使用可变容器并发时,您不应该在CCF中缓存使用者-否则,当工作计数减少,使用者被放入缓存时,不会从该使用者获取任何内容,因此您看到的行为就是随后发生的-代理认为缓存的使用者处于活动状态。DLMC使用者通常是长期存在的,因此您不应该看到大量的使用者创建。不建议将缓存的使用者保留在具有可变并发性的DMLC中,因此我将其固定为10-10,我也不将使用者缓存在DMLC中,而是在CCF中,但是我看到了类似于您上面提到的问题,有解决方案吗?它真的像@M Deinum提到的那样在事务管理器上有问题吗?没人去修理那个?