【问题标题】:Message-driven bean outputs only one value消息驱动的bean只输出一个值
【发布时间】:2014-03-15 17:25:33
【问题描述】:

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

在消息客户端中,我将 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,但它没有。

请帮帮我。

【问题讨论】:

  • 我也这么认为。不确定这是否有助于它,但我没有看到您在客户端代码中关闭会话和连接。也许尝试将其添加到客户端。
  • 试过但没有运气......

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


【解决方案1】:

实际上,这是一个非常常见的错误。在 JMS 规范中,每当您连接时,您总是在处理应用服务器中的池连接。连接总是被处理的。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2017-06-13
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多