【问题标题】:CDI end JMS endpoints: @Produces transacted Session issueCDI 结束 JMS 端点:@Produces 事务处理会话问题
【发布时间】:2016-03-04 01:56:30
【问题描述】:

我正在尝试从一个简单的无状态 EJB 发送/生成 JMS 消息。为此,我使用 CDI 生成和注入 JMS 资源(ConnectionFactoryConnectionSession)。与Weld doc - JavaEE integration, JMS enpoints 中的描述完全相同。

关键是如果我将 JMS 会话生成为trasacted,则我的 EJB 不会发送(或提交)消息。不会发生错误。

CDI 资源生产者:

@Produces
@ItemQualifier
public Session createJMSSession(@ItemQualifier Connection connection) throws JMSException {
    return connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
}

EJB JMS 生产者方法:

public void pushItem(Item newItem) throws Exception {
    log.info("Sending " + newItem.getDescricao());
    log.info("Session Transacted? " + mineracaoSession.getTransacted());

    ObjectMessage message = session.createObjectMessage();

    message.setObject(newItem);
    producer.send(message);

    log.info("Message sent!");
}

如果我更改 Producer 方法以创建非事务 JMS 会话,则消息将正常发送(提交)。

我想了解当 JMS 会话为 transacted 时,为什么我的 EJB 不发送/提交消息。默认情况下,所有 EJB 方法都是事务处理的,对吗?

【问题讨论】:

  • 只是好奇,你用的是什么EE版本?如果您使用的是 EE 7,则可能需要使用新的简化 JMS 接口。
  • 我在 JBossAS 7 上使用 JavaEE 6

标签: jakarta-ee jms cdi


【解决方案1】:

我在JBoss Forum thread 中找到了答案。

总之,如果你想要一个事务处理的 JMS 会话,你必须要么自己控制(提交/回滚)tx,要么使用 JMS XAConnectionFactory。就我而言,我使用的是默认的InVM ConnectionFactory,它不是 XA。因此,在这种情况下,即使使用 EJB,我也必须显式调用 session.commit()。或者将我的 ConnectionFactory 资源更改为 XA 资源。

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2021-07-20
    • 2015-01-08
    • 2011-06-04
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多