[jboss-jira] [JBoss JIRA] (WFLY-4633) CMT MDB response is not part of the transaction

JN JNC (JIRA) issues at jboss.org
Fri May 22 02:42:20 EDT 2015


     [ https://issues.jboss.org/browse/WFLY-4633?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

JN JNC updated WFLY-4633:
-------------------------
           Description: 
My application uses container managed MDB to process client request received on a queue and to send them response on a reply queue.

It seems the response which is sent within the onMessage method scope is being received by the client before onMessage completion and outside same transaction scope.

This is an issue as transaction could be rollbacked and client will receive a success status to its request.

The MDB implementation below illustrate the issue, response is effectively sent even with a rollback only.


  was:
My application uses container managed MDB to process client request received on a queue and to send them response on a reply queue.

It seems the response which is sent within the onMessage method scope is being received by the client before onMessage completion and outside same transaction scope.

This is an issue as transaction could be rollbacked and client will receive a success status to its request.


    Steps to Reproduce: 
MDB code

@TransactionManagement(TransactionManagementType.CONTAINER)
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue") })
public class SimpleRequestReplyListener implements MessageListener {

    @Resource
    private MessageDrivenContext messageDrivenContext;

    @Resource(mappedName = "java:/ConnectionFactory")
    public ConnectionFactory     connectfactory;
    @Resource(mappedName = "java:/queue/testReplyQueue")
    public Queue                 replyQueue;

    public void onMessage(Message message) {
        try {
            String messageText = ((TextMessage) message).getText();

            Connection conn = connectfactory.createConnection();
            conn.start();

            Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            TextMessage messageResponse = session.createTextMessage();
            messageResponse.setText(messageText + " - OK DONE");
            messageResponse.setJMSCorrelationID(message.getJMSCorrelationID());

            MessageProducer producer = session.createProducer(replyQueue);
            producer.send(messageResponse);

            session.close();

            System.out.println("Wait a while before returning");

            if (messageText.contains("ROLLBACK")) {
                messageDrivenContext.setRollbackOnly();
            }

        } catch (Exception e) {
            throw new EJBException("Exception : " + e.getMessage());
        } catch (Throwable e) {
            throw new EJBException("Throwable Exception : " + e.getMessage());
        }
    }

}


Test case

  @Test
    public void testRequestReplyListener() throws NamingException, JMSException, InterruptedException {

        Properties env1 = new Properties();
        env1.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        env1.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
        Context initialContext = new InitialContext(env1);

        ConnectionFactory jmsCF = (ConnectionFactory) initialContext.lookup("jms/RemoteConnectionFactory");
        assertNotNull(jmsCF);

        final Object queue = initialContext.lookup("jms/queue/testQueue");
        assertNotNull(queue);
        assertTrue(queue instanceof Queue);

        final Object replyQueue = initialContext.lookup("jms/queue/testReplyQueue");
        assertNotNull(replyQueue);
        assertTrue(replyQueue instanceof Queue);

        final Connection connection = jmsCF.createConnection();
        connection.start();
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        final MessageProducer outgoing = session.createProducer((Destination) queue);
        TextMessage message = session.createTextMessage("DO SOMETHING");
        long time = System.currentTimeMillis();
        String corId = "testRequestReply_correlationID" + time;
        message.setJMSCorrelationID(corId);
        outgoing.send(message);

        MessageConsumer incoming = session.createConsumer((Destination) replyQueue, "JMSCorrelationID='" + corId + "'");
        Message response = incoming.receive(10000);

        assertNotNull(response);
        String text = ((TextMessage) response).getText();
        assertEquals("Error response doesnt contains expected message: " + text, "DO SOMETHING - OK DONE", text);

        message = session.createTextMessage("DO SOMETHING BUT ROLLBACK");
        time = System.currentTimeMillis();
        corId = "testRequestReply_correlationID" + time;
        message.setJMSCorrelationID(corId);
        outgoing.send(message);

        incoming = session.createConsumer((Destination) replyQueue, "JMSCorrelationID='" + corId + "'");
        response = incoming.receive(10000);
        connection.close();
        
        assertNull("Response is not null: " + ((TextMessage) response).getText(), response);       
    }

  was:
JBoss EAP 6.3.0.GA (AS 7.4.0.Final-redhat-19)

 <subsystem xmlns="urn:jboss:domain:messaging:1.4">
            <hornetq-server>




	



     Affects Version/s: 8.2.0.Final


> CMT MDB response is not part of the transaction
> -----------------------------------------------
>
>                 Key: WFLY-4633
>                 URL: https://issues.jboss.org/browse/WFLY-4633
>             Project: WildFly
>          Issue Type: Bug
>          Components: EJB, JMS
>    Affects Versions: JBoss AS7 7.2.0.Final, 8.2.0.Final
>            Reporter: JN JNC
>            Assignee: Jeff Mesnil
>
> My application uses container managed MDB to process client request received on a queue and to send them response on a reply queue.
> It seems the response which is sent within the onMessage method scope is being received by the client before onMessage completion and outside same transaction scope.
> This is an issue as transaction could be rollbacked and client will receive a success status to its request.
> The MDB implementation below illustrate the issue, response is effectively sent even with a rollback only.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)


More information about the jboss-jira mailing list