Apache Camel JMS/AMQP 组件仅在需要时创建目标队列



我目前正在开发一个使用 Camel 和 Spring Boot 的集成应用程序。集成应用程序中有一个骆驼路由,它从源 Artemis 代理接收消息,这些消息被转换并发送到另一个 Artemis 代理。骆驼路线如下所示:

from(sourceQueue).process(transformProcessor).to(destinationQueue)

当骆驼路由启动时,它会重新创建 from 和 to 中提到的队列名称,并且以前的消息将丢失。我们预计这种情况不会发生。

我发现这样做的一种方法是在Artemis ActiveMQ代理.xml中,禁用队列和主题自动创建并使用Artemis API创建队列。

我的问题是,我们可以配置 Camel JMS/AMQP 组件以仅在队列不存在且存在时使用现有队列时才创建队列吗?

默认情况下,Camel将使用DynamicDestinationResolver。您可以创建自己的自定义目标解析程序并将其插入终端节点(或组件(

.to("jms:queue:myQueue?destinationResolver=MyCustomDestinationResolver");

还可以使用 JndiDestinationResolver,默认情况下,它不会回退到创建动态目标。

我不知道 Artemis,但对于代理来说,删除带有消息的队列听起来很奇怪。至少它的"兄弟"ActiveMQ默认具有您所期望的行为:如果队列不存在,则会自动创建队列,但如果它们已经存在,则它们会保留。

您确定在路由启动时重新创建队列吗?这些队列是否持久?会不会是消费者只是排空队列?我还发现了一个名为 auto-delete-queues 的 Artemis 队列属性,如果队列被消费者耗尽,它将删除队列。

auto-delete-queues 当自动创建的 JMS 队列同时具有 0 个使用者和 0 个消息时,代理是否应自动删除这些队列。