了解 in/out 骆驼中的交换模式行为
understanding in/out exchange pattern behaviour in camel
在骆驼中,不是所有的ENDPOINT
都支持INOUT
ExchangePattern
是正确的吗?
如果是,那么文档的哪一部分告诉哪个端点支持哪个 ExchangePattern
或者这是一种隐含的知识。
ENDPOINT
支持 INOUT
。
下面是我得出结论的代码示例。
我在玩 camel example-jms-file 并将其修改为
queue1 --> queue2 ---> file://test ---> file://test1
context.addRoutes(new RouteBuilder() {
public void configure() {
from("test-jms:queue:test.queue1")
.process(sleep(1))
.to("test-jms:queue:test.queue2");
from("test-jms:queue:test.queue2")
.process(sleep(2))
.to("file://test");
from("file://test")
.process(sleep(3))
.to("file://test1");
}
private Processor sleep(final int sleepId) {
return new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("Going for sleep sleepid=" + sleepId + ", thread=" + Thread.currentThread().getName());
Thread.sleep(5000l);
System.out.println("Done sleep sleepid=" + sleepId + ", thread=" + Thread.currentThread().getName());
}
};
}
});
然后我使用以下代码向队列发送一条消息:
Exchange exchange = new DefaultExchange(context);
exchange.setPattern(ExchangePattern.InOut);
exchange.getIn().setBody("Test Message: 1");
System.out.println("sending msg to queue1");
Exchange send = template.send("test-jms:queue:test.queue1",exchange);
// If queue and file endpoint support INOUT then below line should get printed at last.
System.out.println("received response");
执行上面给出以下响应:
sending msg to queue1
Going for sleep sleepid=1, thread=Camel (camel-1) thread #0 - JmsConsumer[test.queue1]
Done sleep sleepid=1, thread=Camel (camel-1) thread #0 - JmsConsumer[test.queue1]
Going for sleep sleepid=2, thread=Camel (camel-1) thread #1 - JmsConsumer[test.queue2]
Done sleep sleepid=2, thread=Camel (camel-1) thread #1 - JmsConsumer[test.queue2]
received response ## this getting printed here meaning that the file endpoint do not respect the INOUT exchangepattern.
Going for sleep sleepid=3, thread=Camel (camel-1) thread #2 - file://test
Done sleep sleepid=3, thread=Camel (camel-1) thread #2 - file://test
如果我们观察执行输出,我们会看到 received response 在以 FILE
ENDPOINT
.[=23 开始的路由完成之前打印出来=]
这表明文件端点不理解交换是 INOUT 交换
图示:(点击图片放大)
在骆驼中,不是所有的ENDPOINT
都支持INOUT
ExchangePattern
是正确的吗?
如果是,那么文档的哪一部分告诉哪个端点支持哪个 ExchangePattern
或者这是一种隐含的知识。
ENDPOINT
支持 INOUT
。
下面是我得出结论的代码示例。
我在玩 camel example-jms-file 并将其修改为
queue1 --> queue2 ---> file://test ---> file://test1
context.addRoutes(new RouteBuilder() {
public void configure() {
from("test-jms:queue:test.queue1")
.process(sleep(1))
.to("test-jms:queue:test.queue2");
from("test-jms:queue:test.queue2")
.process(sleep(2))
.to("file://test");
from("file://test")
.process(sleep(3))
.to("file://test1");
}
private Processor sleep(final int sleepId) {
return new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("Going for sleep sleepid=" + sleepId + ", thread=" + Thread.currentThread().getName());
Thread.sleep(5000l);
System.out.println("Done sleep sleepid=" + sleepId + ", thread=" + Thread.currentThread().getName());
}
};
}
});
然后我使用以下代码向队列发送一条消息:
Exchange exchange = new DefaultExchange(context);
exchange.setPattern(ExchangePattern.InOut);
exchange.getIn().setBody("Test Message: 1");
System.out.println("sending msg to queue1");
Exchange send = template.send("test-jms:queue:test.queue1",exchange);
// If queue and file endpoint support INOUT then below line should get printed at last.
System.out.println("received response");
执行上面给出以下响应:
sending msg to queue1
Going for sleep sleepid=1, thread=Camel (camel-1) thread #0 - JmsConsumer[test.queue1]
Done sleep sleepid=1, thread=Camel (camel-1) thread #0 - JmsConsumer[test.queue1]
Going for sleep sleepid=2, thread=Camel (camel-1) thread #1 - JmsConsumer[test.queue2]
Done sleep sleepid=2, thread=Camel (camel-1) thread #1 - JmsConsumer[test.queue2]
received response ## this getting printed here meaning that the file endpoint do not respect the INOUT exchangepattern.
Going for sleep sleepid=3, thread=Camel (camel-1) thread #2 - file://test
Done sleep sleepid=3, thread=Camel (camel-1) thread #2 - file://test
如果我们观察执行输出,我们会看到 received response 在以 FILE
ENDPOINT
.[=23 开始的路由完成之前打印出来=]
这表明文件端点不理解交换是 INOUT 交换
图示:(点击图片放大)