2014-05-06 39 views
0

我使用的驱动Bean在列表中存储信息的信息,你可以在下面的代码给出看到:如何从消息驱动Bean获取静态列表?

/** 
* 
* @author sana-naeem 
*/ 
@MessageDriven(mappedName = "jms/Queue-0", activationConfig = { 
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
public class MyMessageBean implements MessageListener{ 
    private static ArrayList<String> list = new ArrayList<String>(); 

    public MyMessageBean() { 
    } 

    @Override 
    public void onMessage(Message message) { 
     Textmessage msg = (TextMessage) message; 
    try { 

      if (message instanceof TextMessage) { 

       list.add("Messages:  "+msg.getText()); 

      } else { 
       System.out.println("No Text!!!"); 
       } 
     } catch (JMSException ex) { 
       System.out.println("JMS.Exception....!!!"); 

     } 

    } 


    public static ArrayList<String> getList() { 
     return list; 
} 

    public void setList(ArrayList<String> list) { 

    this.list = new ArrayList<String>(); 

    } 

} 

现在的问题是,当我访问从另一个Java类的getter方法;它正在显示列表大小= 0;
我可以请知道为什么会发生这种情况;
我想在另一个Java类中获取该列表;
如果队列有问题,请让我知道如何解决?
以前工作正常;其实,以前我使用Servlet发送消息,但现在,我正在使用一个简单的Java类,其中定义了一些初始上下文参数...;所以现在名单不能按预期工作...
任何意见或建议将是非常可观的。 谢谢!

回答

0

您不应该在MDB中使用可变静态字段。当你认为MDB时,认为无状态,因为这是容器如何对待它们。这里有一个很好的参考。

http://www.coderanch.com/t/312086/EJB-JEE/java/Clarification-static-fields

不幸的是,你的问题不是一个单一的答案。如果不了解应用程序的其他部分,设计方式,使用的组件,它们如何交互以及如何部署等,很难提供建议。但考虑到我掌握的信息有限,首先想到的是,您可以创建一个单独的对象来包装一个Private ArrayList,并在适当的上下文中存储对该对象的引用。您的MDB可以访问该对象。在这种情况下,你需要在对象中有修改/读取ArrayList的方法,并且你会在底层ArrayList内部同步这些方法,因为这些方法可以被多个线程访问。

但是这是一种蛮力的方法,不了解你的应用程序的任何其他内容。取决于您的应用程序的设计和部署方式,这可能不是正确的建议。但是,这里的重点是:

  • 您需要将您的有状态对象与旨在成为无状态对象的状态对象分开。
  • 您需要将其从适当的上下文访问。
  • 如果包含对象可以被多个线程访问,则需要同步基础POJO(ArrayList)上的修改/读取方法。
+0

但是,先生,问题是我需要将数据存储在该列表中,然后从另一个Java类获取它; 我该怎么做呢? – Developer

+0

事实上,正如我所说的那样,以前是好的;我正在使用Servlet发送消息,但现在,我正在使用一个简单的Java类wid来定义一些初始上下文参数...;所以现在这个列表正如预期的那样... – Developer

+0

无论如何,这不是使用MDB的正确方式,所以你会得到不一致的结果。我已经更新了我的帖子。 – RickF