当前位置: 首页 > 知识库问答 >
问题:

了解骆驼的进出交换模式行为

彭烨烁
2023-03-14

在camel中,不是所有endpoint都支持INOUT,对吗
如果是,那么文档的哪一部分说明了哪个endpoint支持哪个ExchangePattern,或者这是一种隐含的知识。

它需要ENDPOINT来支持INOUT

下面是我得出结论的代码示例。

我正在玩骆驼示例-jms-file,我将其修改为

队列1--

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

然后我使用下面的代码发送msg到队列:

        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

如果我们观察执行输出,我们将看到收到的响应在从文件开始的路由完成之前打印出来。

这表明文件终结点不理解该交换是INOUT交换

图示:(点击图片放大)

共有2个答案

慕逸仙
2023-03-14

这取决于您对组件的输入和输出有何期望。

在你的例子中

.to("file://test");

写入文件并完成。它不会等待(也不应该等待)另一个进程/客户机提取文件并可能对其进行处理(删除它?)。

如果您正在寻找两条路线之间的通信,请检查direct或seda组件

蒯华彩
2023-03-14

对并非所有camelendpoint都支持INOUT。JMSendpoint支持它,但文件endpoint不支持。

不幸的是,这确实没有很好的记录。

 类似资料:
  • 我已经创建了一个服务代理。 代理(请求类型为)和实际服务(请求类型。)之间有一个处理器。 进入< code > process(Exchange Exchange)方法的交换体属于< code>TypeA。 我能够使用下面的代码行访问数据 现在,我想将此信息更改为。 我使用下面的代码添加主体。 我得到了 现在,我想使用调用真正的服务,它来自。 我尝试进入处理器,但出现以下异常 真正的Web服务没有

  • 我正在设置路由1中骆驼交换的属性。我正在尝试在拆分器内的第二条路由中更新该属性。但是在拆分器的第二次迭代中,我得到的是我在路由1中设置的原始值,而不是新的更新值。下面是我正在尝试的示例。。 豆子里面: 为什么不更新属性?甚至我也试着在标题中设置。同样的结果。非常感谢。

  • 脚本: CSV文件被发送到我的endpoint,Pojo将java数据和消息转换为我的一条路由,比如(“direct:consume”)路由,然后处理器处理该文件,处理消息并创建新的输出 问题: 文件只包含代码中断的一行 文件包含多行代码工作 尝试: 试图找到一种方法来确定交易记录的数量。getIn()。getBody() 阅读stackoverflow 阅读有关exchange的文档 在不知道记

  • 我的测试处理器: 所以我有下一种情况:1)骆驼成功地从“test-camel-start”队列读取消息2)基处理器成功地处理消息3)在重试将消息传递到“test-camel-success”时失败 我收到了下一个日志跟踪: Log说“请求必须包含参数MessageBody”。 我不知道为什么这个消息体没有出现。

  • 我有一条骆驼路线,如下所示。 bean方法顾名思义,分别将body设置为“Hello”和“World”。 我还设置了onException子句,如下所示: 假设,我将一条消息放在队列“开始”上,正文为“测试消息”。在第一个杜米豆中成功处理后,我在第二个杜米豆中抛出一个运行时异常。我希望看到实际的消息或(原始消息内容完好无损,即“测试消息”)被发送到我的死信队列。 但是,死信队列上的消息内容是“He

  • 我有一个简单的路线,看起来像这样: CXF 配置也非常简单: 此简单路由失败,出现以下异常 这是消息历史记录,表明它在