Hi all,

I'm trying to use the XA transactions. I produce 1k items into a queue
using an auto-ack session. Then I try to consume them in an XA transaction,
but only 200 items are received.

The output of the following test is:
java.lang.AssertionError:
Expected :1000
Actual   :200

Why is that? Is that expected?

Viliam

-- Test code:

public class JmsXaTest {
    @ClassRule
    public static EmbeddedActiveMQBroker broker = new
EmbeddedActiveMQBroker();
    private XAConnectionFactory cf = new
ActiveMQXAConnectionFactory(broker.getVmURL());

    @Test
    public void test() throws Exception {
        // produce 1k items to the queue
        try (
            Connection conn = ((ConnectionFactory) cf).createConnection();
            Session session = conn.createSession(false, AUTO_ACKNOWLEDGE);
            MessageProducer producer =
session.createProducer(session.createQueue("queue"))
        ) {
            for (int i = 0; i < 1_000; i++) {
                producer.send(session.createTextMessage("msg-" + i));
            }
        }

        // try to consume all items in an XA transaction
        XAConnection conn = cf.createXAConnection();
        conn.start();
        XASession sess = conn.createXASession();
        Xid xid1 = new MyXid(1);
        sess.getXAResource().start(xid1, XAResource.TMNOFLAGS);
        MessageConsumer cons1 =
sess.createConsumer(sess.createQueue("queue"));
        int count = 0;
        for (; cons1.receive(3000) != null; count++) {
            System.out.println(count);
        }
        assertEquals(1_000, count);
    }

    private static class MyXid implements Xid {
        private byte[] gtrid;

        public MyXid(int val) {
            gtrid = new byte[]{(byte) (val)};
        }

        @Override
        public int getFormatId() {
            return 1;
        }

        @Override
        public byte[] getGlobalTransactionId() {
            return gtrid;
        }

        @Override
        public byte[] getBranchQualifier() {
            return new byte[1];
        }
    }
}

Reply via email to