gpt4 book ai didi

java - Camel JMS 请求回复问题与远程 MessageListener

转载 作者:行者123 更新时间:2023-12-01 14:44:30 25 4
gpt4 key购买 nike

我正在测试使用 Camel 和 ActiveMQ 的 JMS 请求/回复的示例。当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.");

}
});



我现在遇到的问题是我无法让 JMS 请求/回复与存在于 Camel 的 jvm 之外的 MessageListener 一起工作。连接超时等待回复。我确保 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());
}
}
}

最佳答案

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

通常会解析为jms:queue://someQueue,这可能会把事情搞砸。使用 javax.jms.Destination 转换为字符串通常不是一个好主意,除非您采取预防措施。

您可以使用Camel header CamelJmsDestination:headers.put("CamelJmsDestination",message.getJMSReplyTo());

这是否有效,我不知道。一般来说,尝试将 ActiveMQ 与 Web 控制台结合使用(或使用 JMX (jconsole) 连接到 ActiveMQ)来查看队列并尝试找出谁在读取哪个队列以及消息在哪里结束。这真的很有帮助。

关于java - Camel JMS 请求回复问题与远程 MessageListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15588084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com