当手动缓存Connection,Session和MessageProducer时,为什么我的无状态会话Bean不在事务中发送消息?

时间:2016-05-16 08:22:37

标签: jboss transactions ejb jms stateless-session-bean

我正在使用JMS代理,创建MessageProducers的速度很慢/昂贵。 因此,我决定将MessageProducer缓存在无状态会话Bean中。 这非常适用于非事务性情况,但是在使用容器管理XA事务时遇到问题 - 邮件已发送,但不是作为事务的一部分。 知道出了什么问题吗?

有问题的代码:

@Stateless(name = "MyProducerSessionBean")
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
public class MyProducerSessionBean implements MyProducerSessionBeanLocal
{
    @Resource(name = "java:/jms/myConnectionFactory")
    ConnectionFactory myConnectionFactory;

    @Resource(name = "java:/jms/myOutputQueue")
    Queue myOutputQueue;

    Connection connection;
    Session session;
    MessageProducer producer;   

    public MyProducerSessionBean() {}

    @PostConstruct
    public void ejbCreate() {

        try {
            connection = myConnectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            producer = session.createProducer(myOutputQueue);
        } catch (JMSException e) {
            cleanup();
            throw new EJBException(e);
        }
    }

    @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    @Override
    public void sendMessage() {
        try {
            ObjectMessage message = session.createObjectMessage("test");
            producer.send(message);
        } catch (JMSException e) {
            cleanup();
            throw new EJBException(e);
        }
    }

    @PreDestroy
    public void ejbRemove() {
        cleanup();
    }

    public void cleanup() {
        try {
            if(producer != null) producer.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        try {
            if(session != null) session.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        try {
            if(connection != null) connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        producer = null;
        session = null;
        connection = null;
    }
}

当我在sendMessage()方法中创建连接时,一切正常,而不是在@PostConstruct中缓存生成器:

@Stateless(name = "MyProducerSessionBean")
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
public class MyProducerSessionBean implements MyProducerSessionBeanLocal
{
    @Resource(name = "java:/jms/myConnectionFactory")
    ConnectionFactory myConnectionFactory;

    @Resource(name = "java:/jms/myOutputQueue")
    Queue myOutputQueue;

    public MyProducerSessionBean() {}

    @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    @Override
    public void sendMessage() {
        try {
            Connection connection = myConnectionFactory.createConnection();
            Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(myOutputQueue);

            ObjectMessage message = session.createObjectMessage("test");
            producer.send(message);

            producer.close();
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
            throw new EJBException(e);
        }
    }
}

0 个答案:

没有答案