[
https://issues.apache.org/activemq/browse/AMQ-2233?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=51643#action_51643
]
Gary Tully commented on AMQ-2233:
---------------------------------
so the test (your test) I committed to trunk works. It uses
&jms.prefetchPolicy.all=0
With out the prefetch=0 config, the assertion fails for me with list.size() == 1
In the rollback case, receiveAndConvert is called twice so two consumers are
created. The first consumer gets both messages dispatched to it and consumes
one before closing. The second consumer gets nothing. So list.size == 1.
The problem is the consumer.close is deferred till the transaction completes
(commits or rollsback)
The workaround is to only deliver messages on demand, when receive is called,
prefetch=0 gives this.
> After rollback received messages not re-presented
> -------------------------------------------------
>
> Key: AMQ-2233
> URL: https://issues.apache.org/activemq/browse/AMQ-2233
> Project: ActiveMQ
> Issue Type: Bug
> Affects Versions: 5.2.0
> Reporter: Dave Syer
> Assignee: Gary Tully
> Attachments: RawRollbackTests.java
>
>
> After rollback received messages not re-presented. If I receive in a
> transaction and then roll back the messages should be re-presented in the
> next transaction. This used to work in 5.1.0, but is broken in 5.2.0.
> You can browse the Queue in JMX after the rollback and see that the messages
> are still there, but they are not received by a consumer in the same process.
> Here's a test case (fails on the checkPostConditions()):
> {code}
> public class RawRollbackTests {
>
> private static ConnectionFactory connectionFactory;
> private static Destination queue;
> private static BrokerService broker;
> @BeforeClass
> public static void clean() throws Exception {
> FileUtils.deleteDirectory(new File("activemq-data"));
> broker = new BrokerService();
> broker.setUseJmx(true);
> broker.start();
> ActiveMQConnectionFactory connectionFactory = new
> ActiveMQConnectionFactory();
> connectionFactory.setBrokerURL("vm://localhost?async=false");
> RawRollbackTests.connectionFactory = connectionFactory;
> queue = new ActiveMQQueue("queue");
> }
> @AfterClass
> public static void close() throws Exception {
> broker.stop();
> }
> @Before
> public void clearData() throws Exception {
> getMessages(false); // drain queue
> convertAndSend("foo");
> convertAndSend("bar");
> }
> @After
> public void checkPostConditions() throws Exception {
> Thread.sleep(1000L);
> List<String> list = getMessages(false);
> assertEquals(2, list.size());
> }
> @Test
> public void testReceiveMessages() throws Exception {
> List<String> list = getMessages(true);
> assertEquals(2, list.size());
> assertTrue(list.contains("foo"));
> }
>
> private void convertAndSend(String msg) throws Exception {
> Connection connection = connectionFactory.createConnection();
> connection.start();
> Session session = connection.createSession(true,
> Session.AUTO_ACKNOWLEDGE);
> MessageProducer producer = session.createProducer(queue);
> producer.send(session.createTextMessage(msg));
> producer.close();
> session.commit();
> session.close();
> connection.close();
> }
> private List<String> getMessages(boolean rollback) throws Exception {
> Connection connection = connectionFactory.createConnection();
> connection.start();
> Session session = connection.createSession(true,
> Session.AUTO_ACKNOWLEDGE);
> String next = "";
> List<String> msgs = new ArrayList<String>();
> while (next != null) {
> next = (String) receiveAndConvert(session);
> if (next != null)
> msgs.add(next);
> }
> if (rollback) {
> session.rollback();
> } else {
> session.commit();
> }
> session.close();
> connection.close();
> return msgs;
> }
> private String receiveAndConvert(Session session) throws Exception {
> MessageConsumer consumer = session.createConsumer(queue);
> Message message = consumer.receive(100L);
> consumer.close();
> if (message==null) {
> return null;
> }
> return ((TextMessage)message).getText();
> }
> }
> {code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.