当前位置: 首页 > 知识库问答 >
问题:

远程MessageListener的Camel JMS请求回复问题

乐正烨熠
2023-03-14

我正在测试将JMS请求/应答与Camel和ActiveMQ结合使用的示例。当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正在将回复发送到回复队列,我也在设置相关ID。我在这里做错了什么?我已经谷歌了几天,试图解决这个问题,但运气不好。提前感谢您的帮助。

下面是我正在使用的路由,我还将MessageListener逻辑放在下面。

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

MessageListener队列B的消息:

@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());
        }
    }
}

共有1个答案

左恺
2023-03-14
sendBodyAndHeaders("jms:"+ message.getJMSReplyTo().toString(), 
          jsonOutput, headers);

通常会解析为jms:队列://某些队列,这可能会搞砸事情。除非您采取预防措施,否则使用转换为字符串的javax.jms.目标通常不是一个好主意。

您可以使用CamelJmsDestination:CamelJmsDestination头。put(“CamelJmsDestination”,message.getJMSReplyTo())

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

 类似资料:
  • 问题内容: 我需要通过Ajax向远程域发出POST请求,我知道Same-Origin Policy的限制,但我读过,有可能在服务器上的PHP中建立网桥以转发请求。 事实是我不知道如何编写此桥,也无法在Google上找到信息。 我想我需要使用CURL。 有人可以解释一下我怎么写吗? 问题答案: 如果需要代理服务器或“ Bridge ”,则可以尝试以下操作:您可以实现对该PHP脚本的简单AJAX调用,

  • 我对骆驼很陌生,如果这很明显,请原谅。 我们正在尝试设置一条骆驼路线(在 talend esb 中),它执行以下操作: < li >通过JMS接收消息 < li >数据库更新 < li >通过JMS使用请求/回复将消息发送到另一个系统 < li >使用回复中的信息进行另一次数据库更新 这一切都在一条路线上。我发现该路由不再接受 1 中的任何消息。当它正在等待 3 中的回复时。 我曾尝试在JMS组件

  • 问题内容: 从v2.0开始,Elasticsearch默认情况下仅在localhost上侦听,但我想在localhost之外发出请求。 例如,允许这样的请求: 但这不是: (从服务器外部,例如:同一LAN中的本地计算机)。 谢谢你的帮助。 问题答案: 在放

  • 当前线程的作用域“请求”未处于活动状态;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套的异常是java。lang.IllegalStateException:未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然收到此消息,那么您的代码可能在DispatcherServlet/DispatcherPo

  • 使用el-select远程搜索,刚进入页面时不停地调搜索接口,请问是参数设置有什么问题吗?我是根据文档来的 这是搜索的方法 进入页面之后 请各位指点!!

  • 更新:似乎更简单的测试用例不起作用:只是尝试通过进程内代理将消息从 ActiveMQ 生产者发送到 ActiveMQ 消费者。这是代码: 我正在尝试使用akka-camel实现一个非常简单的请求-回复模式。这是我的(测试台)代码,它试图直接使用activeMQ发送消息并期望响应: 我为消费者参与者尝试了两种不同的方法。第一个更简单,它尝试使用响应: 第二次尝试使用Camel模板回复: 我确实看到了