【问题标题】:Returning string from jms从 jms 返回字符串
【发布时间】:2015-07-14 18:25:19
【问题描述】:

我正在编写一个独立的 main 方法,它调用一个生产者(将数据推送到队列中),然后调用一个持续监听主题的消费者。

我已经覆盖了 onMessage 并且我能够从队列中获取消息,但是我无法将消息返回给调用方法。

其实我是想把消息带到浏览器上,所以想试试能不能把它至少带到main。

请帮忙;

class TextMessageListener implements MessageListener {
        String msgData;

        public String getMsgData() {
            return msgData;
        }

        public void setMsgData(String msgData) {
            this.msgData = msgData;
        }

        public void onMessage(Message message) {
            try {
                if (message instanceof TextMessage) {
                    TextMessage textMessage = (TextMessage) message;
                    System.out.println("Received message in  ::" + textMessage.getText() + " '");
                    setMsgData(textMessage.getText());
                }
            } catch (JMSException e) {
                System.out.println("Caught:" + e);
                e.printStackTrace();
            }
        }
    }

【问题讨论】:

  • 使用独立的主要方法,你是如何连接消息队列的。可能这个链接可以帮助你novell.com/documentation/extend5/Docs/help/MP/jms/tutorial
  • @premraj,我正在尝试使用 setMsgData(textMessage.getText());然后我试图调用 getter 来获取值,但不幸的是 getter 没有被调用。
  • 如果您显示应该调用 getter 的代码会有所帮助,因为这似乎是无法正常工作的部分。
  • 问题不清楚,能不能详细点?
  • @GionJh,我正在覆盖 MessageListener,同时从队列中读取。能够打印日志中的值,但无法返回相同的调用函数。

标签: java jms listener activemq


【解决方案1】:

终于有答案了,

retrieving a value from message listener and print in Main

在这个类中,用户给出了一个例子:

@Stateful
public class AManagerBean implements ejb.AManagerRemote {
@Resource(mappedName = "jms/QueueConnectionFactory")
private ConnectionFactory queueConnectionFactory;
@Resource(mappedName = "jms/Queue")
private Queue queue;

private static int fineAmt;

......

static class AListener implements MessageListener{
    public void onMessage(Message message){
         .....
         fineAmt = msg.getInt("fineAmt"); 
        // I NEED FINEAMT TO SHOW IN MAIN CLASS

         .....
    }
}

public int returnFine(){
     return fineAmt;
 }

在主类中...

public class Main {

    @EJB
    public static AManagerRemote amr;

    public static void main(String[] args) {
         ......
         System.out.println(amr.returnFine());
         // ALWAYS RETURN 0

首先,不允许在 EJB 中使用非最终静态变量。 EJB Restrictionc FAQ 中有一个关于此的条目

EJB 中不允许使用非最终静态类字段,因为此类字段会使企业 bean 难以或无法分发。静态类字段在特定类的所有实例之间共享,但仅在单个 Java 虚拟机 (JVM) 内共享。更新静态类字段意味着在类的所有实例之间共享该字段的值。但是,如果一个类同时在多个 JVM 中运行,则只有与更新实例在同一 JVM 中运行的那些实例才能访问新值。换句话说,如果在单个 JVM 中运行,非最终静态类字段的行为将不同于在多个 JVM 中运行。 EJB 容器保留了跨多个 JVM 分发企业 bean 的选项(运行在同一台服务器上,或任何服务器集群上)。不允许使用非最终静态类字段,因为企业 bean 实例的行为取决于它们是否分布。 其次,您已经定义了一个有状态会话 bean。有状态会话 bean 应该具有会话状态,并且客户端(通常)在其生命周期内拥有同一个有状态 bean 的句柄。在您的示例中我看不到任何对话内容(我假设,因为您已经剪掉了一些代码),所以它真的需要是一个有状态的 bean 吗?

所以我建议你做的第一件事是重新设计并尝试让一个更真实的例子运行起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2016-04-13
    • 2015-04-30
    • 1970-01-01
    • 2018-11-24
    • 2016-10-27
    • 2016-02-27
    相关资源
    最近更新 更多