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