java – 从jms返回字符串

前端之家收集整理的这篇文章主要介绍了java – 从jms返回字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在写一个独立的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();
            }
        }
    }

解决方法

终于得到了答案,

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?

所以我建议你做的第一件事是做一个重新设计,并试图让一个更真实的生活例子上升和运行.

猜你在找的Java相关文章