我有这种情况:
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
谢谢。
答案 0 :(得分:1)
我想我找到了一种解决方案,但是我不知道这是最好的解决方案。
我在目标队列上添加了过滤器:
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");
}
});
这行得通,但是正如我所说,我不知道这是否是最好的方法。
答案 1 :(得分:0)
尝试在生产者端点上禁用“ replyTo”:
.to("artemis:ADDRESS2::ADDRESS2.QUEUE1?disableReplyTo=true")