【问题标题】:JMS message producer won't send message to queueJMS 消息生产者不会将消息发送到队列
【发布时间】:2016-12-10 05:32:41
【问题描述】:

我设置了一个 EJB 项目以使用 JMS 将持久性实体对象发送到 MDB。我正在使用 JBoss EAP 7,使用 Apache ActiveMQ 作为消息传递提供程序。我这样设置 ConnectionFactory 和 Queue:

这是我的消息生产者,它接收“帐户”实体对象作为参数并将其发送到队列:

EntityEnqueueBean.java

@Stateless
@LocalBean
public class EntityEnqueueBean {

  Context context = null;

  public void enqueueEntity(Account accountEntity) {    
      try {
          context = new InitialContext();
          ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:/ConnectionFactory");
          Destination queue = (Destination) context.lookup("java:/jms/queue/AccountAccessQueue");
          Connection connection = connectionFactory.createConnection();
          Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
          MessageProducer messageProducer = session.createProducer(queue);
          ObjectMessage objectMessage = session.createObjectMessage(accountEntity);
          messageProducer.send(objectMessage);

          messageProducer.close();
          session.close();
          connection.close();
      } catch (JMSException | NamingException e) {
          e.printStackTrace();
        }
   }
}

MDB 从队列中接收消息并处理它:

AccountPersistenceMDB.java

@MessageDriven(
    activationConfig = { @ActivationConfigProperty(
            propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty( propertyName = "destination", 
            propertyValue ="java:/jms/queue/AccountAccessQueue")
    })
public class AccountPersitenceMDB implements MessageListener {

  public void onMessage(Message message) {
      ObjectMessage objectMessage = null;
      objectMessage = (ObjectMessage) message;
      try {
          Account accountEntity = (Account) objectMessage.getObject();
          System.out.println("MDB accessCount: " + accountEntity.getAccessCount());
      } catch (JMSException e) {
          e.printStackTrace();
      }
  }
}

不知道我做错了什么。我可能得到了设置 ConnectionFactory 和队列的代码错误,但我不确定,因为我是 Java EE 的新手。任何帮助表示赞赏。

【问题讨论】:

  • 服务器日志上有任何堆栈跟踪吗?有什么例外吗?
  • @RamachandranGA 不,一切正常,但 MDB 应该显示结果的部分不起作用。此外,在 JBoss 管理面板上监控队列显示队列上从未发送过任何消息。我无法确定我做错了什么。
  • 可能是事务有问题,你的消息没有被提交..尝试将会话更改为这个.. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  • 正如@mendieta 所说,将transacted 参数设置为true 意味着您要手动提交或回滚会话(例如:session.commit();)。

标签: java jboss jms


【解决方案1】:

感谢@mendieta,我解决了这个问题。我阅读了 JMS 会话,它非常有意义。在 EntityEnqueueBean.java 中更改这一行就成功了:

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

【讨论】:

  • 我通过相反的方式解决了一个问题。 Session.AUTO_ACKNOWLEDGE -> Session.SESSION_TRANSACTED。
猜你喜欢
  • 2013-02-21
  • 2016-05-02
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多