消息驱动的bean只输出一个值

时间:2014-02-16 13:29:18

标签: java-ee jms message-driven-bean java-ee-7

我是java消息驱动bean的新手,我有一点问题。我做了一个测试web项目(服务器是glassfish 4.0)。

在messageclient中,我将3个字符串发送到消息队列。如果我正确理解消息驱动的bean,消息驱动的bean 应该在我的控制台中写出所有值,而是只写入队列中的第一个值。 我正在尝试实现这一点,因为我需要不同的线程来从我的Web应用程序向客户发送电子邮件。可能有更好的方法吗?

这是我的留言客户端的代码:

@Named(value = "messageDrivenbean")
@ViewScoped
public class MessageDrivenBeanClient implements Serializable
{
ArrayList <String>mail;
@Resource(name="connFactory", mappedName="mailConnFactory")
private  QueueConnectionFactory QueueConnectionFactory;

@Resource(name="jmsQueue", mappedName="Queue")
private  Queue queue;

 /**
 * Creates a new instance of testingbean
 */
 public MessageDrivenBeanClient() 
 {
 }
 @PostConstruct
 public void init(){

 }
 Connection conn;
 public void start() throws JMSException
 {
  String text;
  Message msg = null;
 final int NUM_MSGS = 3;


  conn = QueueConnectionFactory.createConnection();

 Session sesion=conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
 MessageProducer msgProducer=sesion.createProducer(queue);
 msg=sesion.createTextMessage();


for (int i = 0; i < NUM_MSGS; i++) {
text = "This is message " + (i + 1);
System.out.println("Sending message: " + text);

msg.setStringProperty("message", text);
msgProducer.send(msg);
  }
 }

}

我的消息驱动bean:

@MessageDriven(activationConfig =
{
 @ActivationConfigProperty
 (propertyName="destinationType",propertyValue="javax.jms.Queue"),            
 @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "Queue")
 })
 public class MsgDrivnBean implements MessageListener
 {

  @Resource
  private MessageDrivenContext mdc;

  public MsgDrivnBean()
 {
 }



@Override
  public void onMessage(Message message)
  {
    TextMessage tm=null;
    try{
      if(message instanceof TextMessage){
       tm= (TextMessage) message;
       System.out.println(message.getStringProperty("message"));
       System.out.print("sem v msgdrivenbeanu"+ tm.getStringProperty("message"));
      //logger.error(tm.getText());
      }
      else
      {
        System.out.println("Error");
      }
    }
    catch(JMSException jms)
    {
      jms.printStackTrace();
      mdc.setRollbackOnly();
    }
  }


}

我目前的输出是:


Sending message: This is message 1
INFO:   Sending message: This is message 2
INFO:   Sending message: This is message 3
INFO:   This is message 1
INFO:   sem v msgdrivenbeanuThis is message 1

我认为它也应该写出消息2和消息3,但事实并非如此。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

实际上,这是一个非常常见的错误。在JMS规范中,无论何时连接,您总是在应用服务器中处理池连接。连接始终是交易的。

您不能以这种方式重复使用邮件。请在每次发送新消息时实例化。

请尝试将message.acknowledge()添加到您的MDB代码中。

编辑:另外,如果你真的在Java EE 7上,你应该考虑切换到JMSContext类来发送消息。更清洁的API。