0

Camel と ActiveMQ で JMS Request/Reply を使用する例をテストしています。camel がリスナーを作成するときに、この例を機能させることができます。すなわち。

from("direct:entryPoint").inOut("jms:queue:A");

from("jms:queue:A").
    process(new Processor() {

        @Override
        public void process(Exchange exchange) throws Exception {
            exchange.getIn().setBody("Hello World.");

        }
    });



私が今抱えている問題は、Camel の jvm の外部に存在する MessageListener で動作する JMS 要求/応答を取得できないことです。接続が応答を待機してタイムアウトになりました。MessageListener が応答を replyTo キューに送信していることを確認し、correlationId も設定しています。ここで何が間違っていますか?私はこれを理解するために何日もグーグルで検索しましたが、うまくいきませんでした。ご協力いただきありがとうございます。

以下は私が使用しているルートであり、MessageListener ロジックも下に置きます。

from("direct:entryPoint").
  inOut("jms:queue:B?concurrentConsumers=4&requestTimeout=240000");

キュー B の MessageListener onMessage:

@Override
public void onMessage(Message message) {

    String msg = null;
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
    String jsonOutput = null;

    try{
        msg = ((TextMessage) message).getText();

        //convert message payload to purchase order
        PurchaseOrder order = mapper.readValue(msg, PurchaseOrder.class);

        //Set the id to see if the request reply worked.
        order.setOrderId(BigInteger.valueOf(111111111));


        if(message.getJMSReplyTo() != null){
            Map<String, Object> headers = new HashMap<String, Object>();
            headers.put("JMSCorrelationID", message.getJMSCorrelationID());
            headers.put("JMSReplyTo", message.getJMSReplyTo().toString());  
            jsonOutput = mapper.writeValueAsString(order);

            //Camel runs on the external jvm so leverage the producerTemplate.
            producerTemplate.
              sendBodyAndHeaders("jms:"+ message.getJMSReplyTo().toString(), 
              jsonOutput, headers);
        }
    }
    catch(Exception e){
        logger.fatal(e.getMessage());

        try {
            if(message.getJMSReplyTo() != null){
                Map<String, Object> headers = new HashMap<String, Object>();
                headers.put("JMSCorrelationID", message.getJMSCorrelationID());

                producerTemplate.
                 sendBodyAndHeaders("jms:"+ message.getJMSReplyTo().toString(),
 e.getMessage(), headers);
            }
        } catch (JMSException e1) {
            logger.fatal(e1.getMessage());
        } catch (Exception e1) {
            logger.fatal(e1.getMessage());
        }
    }
}
4

1 に答える 1

1
sendBodyAndHeaders("jms:"+ message.getJMSReplyTo().toString(), 
          jsonOutput, headers);

通常、jms:queue://someQueue物事を台無しにする可能性があるものに解決されます。文字列に変換された javax.jms.Destination を使用することは、予防策を講じない限り、通常はお勧めできません。

Camelヘッダーを使用できますCamelJmsDestinationheaders.put("CamelJmsDestination",message.getJMSReplyTo());

それがうまくいくかどうか、私にはわかりません。一般に、Web コンソールで ActiveMQ を使用して (または JMX (jconsole) で ActiveMQ に接続して) キューを調べ、誰がどのキューを読んでいて、メッセージがどこに行き着くかを調べてみてください。本当に助かります。

于 2013-03-23T18:23:44.110 に答える