如何实现请求回复模式

时间:2013-04-28 08:37:22

标签: java design-patterns activemq message-queue apache-camel

我正在尝试使用Camel,Spring和ActiveMQ来实现request-reply pattern。 我需要做的是逐行读取CSV文件。 然后是每一行:

  1. 根据CSV
  2. 中的行值构建请求
  3. 将请求发送到队列
  4. 其他组件需要接收消息,处理请求并将响应发送到另一个消息队列(生产者已知,因此生产者可以获取响应)。
  5. 我得到了以下代码。 现在让我们说在处理器中我创建了响应。

    我的问题是:

    1. 如何发送回复?
    2. 如何使用响应?

    3. public class MyRouteBuilder extends RouteBuilder {
      
          public static void main(String[] args) throws Exception {
              new Main().run(args);
          }
      
          public void configure() {
              from("file:/Users/aviad/ws/integ/src/data?fileName=lines.txt&noop=true&idempotent=true")
              .split()
              .tokenize("\\n")
              .inOut("activemq:req");
      
              from("activemq:req")
              .process(new Processor() {
                  public void process(Exchange exchange) throws Exception {
                      System.out.println(exchange.getIn().getBody(String.class));
                      System.out.println("jmscorrelationid=" + exchange.getIn().getHeader("jmscorrelationid"));
                      System.out.println("jmsdestination=" + exchange.getIn().getHeader("jmsdestination"));
                  }
              });
          }
      }
      

1 个答案:

答案 0 :(得分:2)

如果在传入的JMS消息上设置了JMSReplyTo,Camel会自动发送响应。因此,在第二条路径中,当消息到达路径的末尾时,JMS使用者将使用给定的JMSCorrelationID将消息“作为其当前状态”作为回复消息发送回JMSReplyTo目的地。

您可以在JMS端点上设置许多选项以禁用自动发送回复。或者指定命名的回复队列等。有关其所有选项,请参阅JMS页面:http://camel.apache.org/jms

当您从第一条路线使用inOut时,Camel将通过JMS进行请求 - 回复。默认情况下,它使用临时队列。但是你也可以告诉Camel使用命名队列(我们称之为固定队列)。请参阅JMS文档:http://camel.apache.org/jms

请注意JMS页面顶部的提示:http://camel.apache.org/jms。它会引导您访问页面上有关请求/回复详细信息的部分。所以去看看。