java - 为什么消息卡在安慰服务器上?

标签 java spring jms spring-jms solace

我正在使用以下设置为我的应用程序使用 spring DMLC,我正面临 DMLC 的奇怪行为,如果我仅在监听器队列上发送 1000 条消息,~1990 很快到达 dmlc,~10 卡在服务器上,在进一步分析我发现这 10 个确认没有发回,这就是为什么我可以在服务器上看到它们,几分钟后发回确认但速度非常慢。

此外,我在 CachingConnectionFactory 中尝试了 cacheConsumers=false 并且一切都变得很好,但是这使得频繁绑定(bind)/取消绑定(bind)到 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 更改为级别 3 (CACHE_CONSUMER)。这样,消费者将在 DMLC 级别缓存,并且应该解决消息卡住的问题,而不会看到频繁的绑定(bind)/取消绑定(bind)。

cacheConsumer 应该设置为 false 并且您应该让 DefaultMessageListenerClasse 控制缓存,因为最好让监听器容器在其生命周期内处理适当的缓存。 Spring 文档 (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/DefaultMessageListenerContainer.html) 中的以下说明对此进行了讨论:

Note: Don't use Spring's CachingConnectionFactory in combination with dynamic scaling. Ideally, don't use it with a message listener container at all, since it is generally preferable to let the listener container itself handle appropriate caching within its lifecycle. Also, stopping and restarting a listener container will only work with an independent, locally cached Connection - not with an externally cached one.

关于java - 为什么消息卡在安慰服务器上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35057107/

相关文章:

java - 何时或在什么情况下我应该使用Optional来检查null?

java - Spring + EntityManagerFactory +Hibernate 监听器 + 注入(inject)

mysql - 在运行 JUnit 测试之前重置 mysql 数据库

java - 检测 ActiveMQ 主题的使用者的变化

java - 在不同的数据库上复制修改后的数据

java - 使用同一张表的不同项目的特定配置

java - 使用 MyBatis 将集合持久化到对象中

jms - HornetQ核心API与JMS的性能对比

java - 如何用泛型参数覆盖具有对象参数的方法?

java - 使用 Spring Boot 运行脚本时出现 SQL 错误