从 jms 返回字符串

Returning string from jms

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

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

其实我是想把消息携带到浏览器,所以想测试一下能不能至少携带到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();
            }
        }
    }

终于得到答案,

retrieving a value from message listener and print in Main

在此class,用户举了个例子:

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

主要class...

public class Main {

    @EJB
    public static AManagerRemote amr;

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

首先,不允许在 EJB 中使用非最终静态变量。 EJB 限制常见问题解答

中有一个关于此的条目

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

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