2015-11-30 2 views
0

Я пытаюсь отправить/написать JMS-сообщения из простого безголового EJB. Для этого я использую CDI для создания и ввода ресурсов JMS (ConnectionFactory, Connection и Session). Точно как описано в Weld doc - JavaEE integration, JMS enpoints.Конечные точки JMS конца CDI: @Produces transacted Session issue

Дело в том, что я создаю сеанс 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 Session сообщения посылается (поручен) нормально.

Я хотел бы понять, почему мой EJB не отправляет/фиксирует сообщения, когда сеанс JMS равен transacted. Все методы EJB по умолчанию транслируются, не так ли?

+0

Просто любопытно, какую версию вы используете? Если вы используете EE 7, вы можете использовать новые упрощенные интерфейсы JMS. –

+0

Я использую JavaEE 6 на JBossAS 7 – Tuelho

ответ

0

Я нашел ответ в этом JBoss Forum thread.

В сумме, если вы хотите провести сеанс JMS, вам нужно либо управлять (фиксацией/откатом) tx самостоятельно, либо использовать JMS XAConnectionFactory. В моем случае я использовал значение по умолчанию InVM ConnectionFactory, которое не является XA. Таким образом, в этом случае даже с использованием EJB я должен был явно вызывать session.commit(). Или измените мой ресурс ConnectionFactory на XA.