You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Gary Tully (JIRA)" <ji...@apache.org> on 2009/07/08 11:04:07 UTC

[jira] Resolved: (AMQ-2233) After rollback received messages not re-presented

     [ https://issues.apache.org/activemq/browse/AMQ-2233?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Gary Tully resolved AMQ-2233.
-----------------------------

       Resolution: Fixed
    Fix Version/s: 5.3.0

resolving as per dave's comment, current snapshot has a fix.

> 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
>             Fix For: 5.3.0
>
>         Attachments: RawRollbackSharedConsumerTests.java, RawRollbackTests.java
>
>   Original Estimate: 0 minutes
>  Remaining Estimate: 0 minutes
>
> 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.