我正在写一个独立的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?
所以我建议你做的第一件事是做一个重新设计,并试图让一个更真实的生活例子上升和运行.