java - 使用 camel jms 组件从 activemq 卡住消息消费

标签 java spring apache-camel spring-jms

我有一个包含两条 Camel 路线的应用程序:

Route 1 (Consumer Route)

读取一个没有的文本文件。记录(行分隔),根据每一行拆分它们并将每个拆分记录发送到另一个队列(“中间”队列)

Route 2 (Producer Route)

从中间队列读取每条记录,转换它们并将它们发送到输出队列。

我将 ActiveMQ 与 camel JmsComponent (concurrentConsumers=7, maxConcurrentConsumers=10) 一起使用。我猜 camel 在底层使用 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 条或更少),拆分记录卡在中间队列中。 Producer Route 正在运行,但没有消息消费。在任何日志中都没有发现异常,Consumer Route 也已启动并运行。

但是,通过将 prefetch 限制设置为 0,这个问题就消失了,但会导致另一个问题 - 无法通过 ctrl+CcacheLevelCACHE_CONSUMER。尽管 CACHE_AUTO 工作正常,但性能会下降。

prefetch > 0 和 SpringDMLC 是否存在任何已知问题,或者我是否遗漏了什么?

最佳答案

我知道这个问题很老了,但也许有人会从解决方法中受益。我们遇到了同样的问题,虽然我们没有深入了解它(资源有限且需要及时修复),但我们至少将 Camel 隔离为问题源。

我们实现的解决方法是简单地使用两个不同的 JMS 组件 - 一个用于消费者,一个用于生产者。如果有许多消费者/生产者对在同一队列中生产/消费,您可以将所有消费者放在一个组件中,将所有生产者放在另一个组件中。引入分离后,我们再也没有遇到过这个特殊问题。

关于java - 使用 camel jms 组件从 activemq 卡住消息消费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37961428/

相关文章:

java - 正则表达式只允许 Java 字符串中出现一个标点符号

java - Set的映射需要Id吗?

java - 无法在 Spring Boot 上设置静态网站

java - 如何保护我的 Apache Camel REST API?

java - Apache Camel : How to test for instance of Set<CustomObject>

java - 运行 Apache Camel 时出错

java - 使用 jaxb 解码元素属性和文本以分隔字段

java - 如何在使用注释的同时使用 mybatis 中的 hashmap 将值插入到行中?

java - 玩! 2.0 + Spring + MyBatis Java 示例

java - 你如何在 quickfixj 消息中获得重复组