【问题标题】:Process a value received by void onMessage() and pass the value to a different function处理由 void onMessage() 接收的值并将该值传递给不同的函数
【发布时间】:2012-11-23 13:59:47
【问题描述】:

场景

我通过实现 messageListener 来使用来自 WebLogic 队列的消息。 onMessage() 调用成功,接收到的消息可以从 onMessage 函数中打印出来。

要求

接收到这个msgText后立即处理,并将处理后的结果返回给调用方法。

代码

@Override

public void onMessage(Message msg) {

try {
    String msgText;
    if (msg instanceof TextMessage) {
        msgText = ((TextMessage) msg).getText();
    } else {
        msgText = msg.toString();
    }
    System.out.println(msgText);

} catch (JMSException ex) {
    ex.printStackTrace();
}

}

【问题讨论】:

  • 你有什么问题?
  • 目的是将结果返回给另一个类中的调用方法

标签: java jms parameter-passing


【解决方案1】:

这是不可能的,因为您的消息驱动 bean 不知道哪个方法将消息发布到消息队列上,而且 MDB 中通常没有回调机制。

但是,有一个技巧可以提供帮助。它被称为TemporaryQueue,应该如下使用。在消息生产者中添加这部分代码:

// OPEN CONNECTION AND CREATE SESSION
..
TemporaryQueue tempQueue = session.createTemporaryQueue();
msg.setJMSReplyTo(tempQueue);
// SEND MESSAGE
..
MessageConsumer mc = session.createConsumer(tempQueue);
Message retMsg = mc.receive(); //WAITING FOR A RESPONSE..

在消费者(你的消息驱动 bean)中使用这个临时队列:

Queue destination = (Queue) message.getJMSReplyTo();
// CREATE PRODUCER, CREATE MESSAGE AND SEND THE MESSAGE

这样您将模拟回调机制。对象retMsg 应该包含处理结果,你就完成了。

【讨论】:

    【解决方案2】:

    您是否尝试将处理消息的结果返回给调用函数?如果是这样,我认为这里不可能,因为这将是一个异步调用。

    如果没有,请清楚地发布您的问题。

    【讨论】:

    • 如何打印收到的来自不同班级的消息?
    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 2013-12-12
    • 2016-10-10
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多