Apache Camel没有发送传入消息的回复

时间:2018-04-06 15:34:09

标签: java apache-camel jms message-queue messaging

我有Camel路由,它侦听传入的JMS消息。由于某种原因,路由不会向JMS replyTo地址发送响应。在以下示例中,程序挂起等待回复消息到达临时目标。如何使JMS监听路由处理消息InOut-fashion?

{ status: 200, json: Promise})

@Component("testRouteBuilder")
public class TestRouteBuilder extends RouteBuilder {

    @SuppressWarnings("unchecked")
    @Override
    public void configure() throws Exception {

        from("timer://foo?delay=2000")
            .setBody(simple("hello"))
            .log("request: ${body}")
            .to("bean://jmsbean")
            .log("reply: ${body}");

        from("jms://queue:dest")
//          .setExchangePattern(ExchangePattern.InOut) // Not working
            .log("got message")
            .log("${headers}")
            .setBody(constant("reply"));
    }

    @Component("jmsbean")
    public static class JmsBean {

        @Autowired
        ConnectionFactory jmsServer1;

        @Autowired
        ConnectionFactory jmsServer2;

        public String testJms(@Body String body) throws JMSException {

            Connection conn = jmsServer1.createConnection();
            conn.start();
            Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

            Connection conn2 = jmsServer2.createConnection();
            conn2.start();
            Session session2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);

            TemporaryQueue tempQueue = session2.createTemporaryQueue();

            TextMessage message = session.createTextMessage();
            message.setJMSCorrelationID("tuomas");
            message.setJMSReplyTo(tempQueue);
            message.setJMSMessageID("tuomas");

            Queue dest = session.createQueue("dest");
            MessageProducer producer = session.createProducer(dest);
            producer.send(message);

            session.close();
            conn.close();

            MessageConsumer consumer = session2.createConsumer(tempQueue, "tuomas");
            Message reply = consumer.receive();

            session2.close();
            conn2.close();

            return reply.getBody(String.class);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

AFAIK,Camel默认发送一条消息给replyTo队列。在JMS component docs属性disableReplyTo中声明了这一点。我自己经历过这样的行为。

但是,示例中的任何使用者都不会使用您的消息。例如,您可以尝试将其发送到某个bean。