Camel Apache Artemis -通过多个队列按地址路由消息

pw136qt2  于 2023-10-18  发布在  Apache
关注(0)|答案(2)|浏览(131)

我有这样的场景:

ADDRESS1:
   -ADDRESS1.QUEUE1
   -ADDRESS1.QUEUE2

ADDRESS2:
   -ADDRESS2.QUEUE1
   -ADDRESS2.QUEUE2

具有多个任播队列的两个地址。我需要将消息路由到指定的队列中的地址。
范例:

Messages on ADDRESS1::ADDRESS1.QUEUE1 goes to -> ADDRESS2::ADDRESS2.QUEUE1 
Messages on ADDRESS1::ADDRESS1.QUEUE2 goes to -> ADDRESS2::ADDRESS2.QUEUE2

这是我的代码:

CamelContext context = new DefaultCamelContext();
    ConnectionFactory factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://0.0.0.0:61616");

    context.addComponent("artemis", JmsComponent.jmsComponentAutoAcknowledge(factory));

    context.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {
            from("artemis:ADDRESS1::ADDRESS1.QUEUE1")
            .log("${body}")
            .to("artemis:ADDRESS2::ADDRESS2.QUEUE1");
        }
    });

    context.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {
            from("artemis:ADDRESS1::ADDRESS1.QUEUE2")
            .log("${body}")
            .to("artemis:ADDRESS2::ADDRESS2.QUEUE2");
        }
    });

使用此代码,我只能使用来自特定队列的消息。但是“.to”不管用。有什么办法可以做到吗?
我需要这样做,因为我有许多应用程序是消费者,所以我想使用地址来“按应用程序”分隔队列。
就像这样:

APP1
   QUEUE1
   QUEUE2
   QUEUE3

先谢了。

quhf5bfb

quhf5bfb1#

我想我找到了一个解决办法,但我不知道是不是最好的。
我在目标队列上添加了过滤器:

ADDRESS2:
       -ADDRESS2.QUEUE1 - Filter -> DESTIONATION = 'QUEUE1' 
       -ADDRESS2.QUEUE2 - Filter -> DESTIONATION = 'QUEUE2'

当我使用camel路由消息时,我设置了一个带有值的Header,.to()我只设置了Address名称:

context.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {
            from("artemis:ADDRESS1::ADDRESS1.QUEUE1")
            .log("${body}")
            .setHeader("DESTINATION", constant("QUEUE1"))
            .to("artemis:ADDRESS2");
        }
    });

    context.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {
            from("artemis:ADDRESS1::ADDRESS1.QUEUE1")
            .log("${body}")
            .setHeader("DESTINATION", constant("QUEUE2"))
            .to("artemis:ADDRESS2");
        }
    });

这是可行的,但正如我所说,我不知道这是否是最好的方法。

vxf3dgd4

vxf3dgd42#

尝试在生产者端点上禁用“replyTo”:

.to("artemis:ADDRESS2::ADDRESS2.QUEUE1?disableReplyTo=true")

相关问题