从jms返回字符串

Sau*_*ala 10 java activemq-classic jms listener

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

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

实际上,我想把这条消息带到浏览器,因此想测试一下我是否可以将它至少带到主机上.

请帮忙;

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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Sau*_*ala 3

终于得到答案了,

从消息侦听器中检索值并在 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;
 }
Run Code Online (Sandbox Code Playgroud)

在主课中...

public class Main {

    @EJB
    public static AManagerRemote amr;

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

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

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

因此,我建议您要做的第一件事是重新设计并尝试建立并运行更真实的示例。