【问题标题】:Apache Artemis - Route messages by addresses with multiple queuesApache Artemis - 通过具有多个队列的地址路由消息
【发布时间】:2019-01-11 10:27:15
【问题描述】:

我有这种情况:

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

提前致谢。

【问题讨论】:

    标签: apache apache-camel activemq wildfly activemq-artemis


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的回复。我对这个参数有同样的行为:(
    【解决方案2】:

    我想我找到了一个解决方案,但我不知道是否是最好的。

    我在目标队列中添加了过滤器:

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

    当我用骆驼路由消息时,我设置了一个带有值的 Header,而 .to() 我只设置了地址名称:

        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");
            }
        });
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2019-01-17
      • 2020-12-26
      • 1970-01-01
      • 2015-08-29
      • 2019-08-16
      相关资源
      最近更新 更多