【发布时间】:2016-10-24 00:08:11
【问题描述】:
我有一个包含两条骆驼路线的应用程序:
路线 1(消费者路线)
读取没有的文本文件。记录(行分隔),根据每一行拆分它们并将每个拆分记录发送到另一个队列('中间'队列)
路线 2(生产者路线)
从中间队列中读取每条记录,对其进行转换并将它们发送到输出队列。
我正在使用 ActiveMQ 和骆驼 JmsComponent (concurrentConsumers=7, maxConcurrentConsumers=10)。我猜骆驼在下面使用 Spring DMLC 从队列中读取。
配置:
activemq.broker.uri = tcp://0.0.0.0:61616?jms.useAsyncSend=true&jms.prefetchPolicy.queuePrefetch=1
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jmsmqConnectionFactory" />
<property name="reconnectOnException" value="true" />
<property name="sessionCacheSize" value="7" />
</bean>
<bean id="jmsComponent" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="cacheLevelName" value="CACHE_CONSUMER" />
<property name="transacted" value="true" />
<property name="transactionManager" ref="transactionManager" />
</bean>
jmsComponent:queue:INTERMEDIATE?concurrentConsumers=7&maxConcurrentConsumers=10
现在,问题是,如果不是。文件中的记录非常少(10 或更少),拆分记录卡在中间队列中。生产者路由正在运行但没有消息消费。在任何日志中都没有发现异常,并且消费者路由也已启动并正在运行。
但是,通过将 prefetch 限制设置为 0,这个问题消失了,但导致了另一个问题 - 骆驼路线无法被 ctrl+C 强制停止,cacheLevel 为 CACHE_CONSUMER。虽然CACHE_AUTO 工作正常,但性能下降。
现在prefetch > 0 和 SpringDMLC 是否存在任何已知问题,还是我遗漏了什么?
【问题讨论】:
-
hmm 我可以注意到预取大于零的已知问题。但是,请记住预取是在您需要处理它们之前从 ActiveMQ 中提取记录。默认情况下,当骆驼收到停止时,它会首先尝试完成对记录的处理。如果您在尝试完成处理时正在使用的组件关闭,您可能会遇到死锁。您是否查看过 JMX 以查看是否仍有消息卡在执行过程中?
标签: java spring apache-camel spring-jms