2013-04-28 2 views
0

Я пытаюсь реализовать request-reply pattern с помощью Camel, Spring и ActiveMQ. Что мне нужно сделать, это чтение файла CSV по очереди. Тогда для каждой строки: ЗапросКак реализовать запрос Образец отзыва

  1. Construct на основе значений строк из CSV
  2. Отправить запрос в очередь
  3. Другой компонент должен забрать сообщение, обработать запрос и отправить ответ другая очередь сообщений (известная продюсеру, поэтому производитель может получить ответ).

У меня код ниже работает. Теперь скажем, что в Процессоре я создаю ответ.

Мои вопросы:

  1. Как я могу отправить ответ обратно?
  2. Как я могу использовать отклик?

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

Возможный дубликат [Использовать шаблон запроса-ответа с использованием ActiveMQ, Camel и Spring] (http://stackoverflow.com/questions/16243433/implement-request-reply-pattern-using-activemq-camel-and-spring) –

+0

не дубликат. скорее более конкретным. – aviad

ответ

2

верблюд отправляет автоматический ответ обратно, если есть JMSReplyTo установлен на входящем сообщении JMS. Таким образом, на вашем втором маршруте, когда сообщение достигнет конца маршрута, потребитель JMS отправит обратно сообщение «как оно есть в настоящее время» в ответное сообщение в адрес JMSReplyTo с данным JMSCorrelationID.

Существует множество опций, которые вы можете установить на конечной точке JMS, чтобы отключить автоматическую отправку ответа. Или указать именованную очередь ответов и т. Д. См. Страницу JMS для всех ее опций: http://camel.apache.org/jms

Как вы используете inOut с 1-го маршрута, то Camel выполнит запрос-ответ по JMS. И по умолчанию он использует временные очереди. Но вы также можете сказать, что Camel использует именованные очереди (фиксированные очереди, как мы его называем). См. Документы JMS: http://camel.apache.org/jms

И обратите внимание на наконечник в верхней части страницы JMS: http://camel.apache.org/jms. Это относится к разделу на странице о деталях запроса/ответа. Так что прочитайте это.

+0

спасибо! После прочтения всех упомянутых документов я до сих пор не понимаю, что мне нужно добавить на первом корне, чтобы иметь возможность запускать код при поступлении ответа. Любые намеки? – aviad

+0

Просто добавьте больше маршрута после inOut, например .inOut ("activemq: req"). Process (...) ... –

+0

получил it.cheers mate! BTW: хорошая книга :) – aviad

Смежные вопросы