[
https://issues.apache.org/jira/browse/QPID-4088?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Keith Wall resolved QPID-4088.
------------------------------
Resolution: Won't Fix
Agreed in a product backlog review - won’t fix.
> Java JMS client does not fully conform JMS spec requirements 4.3.5 about
> closing a connection
> ---------------------------------------------------------------------------------------------
>
> Key: QPID-4088
> URL: https://issues.apache.org/jira/browse/QPID-4088
> Project: Qpid
> Issue Type: Bug
> Components: Java Client
> Affects Versions: 0.6, 0.8, 0.10, 0.12, 0.14, 0.16, 0.17
> Reporter: Alex Rudyy
>
> Java JMS client does not fully conform JMS spec requirements 4.3.5 about
> closing a connection:
> {quote}
> 4.3.5 Closing a Connection
> If one or more of the connection’s session’s message listeners is processing
> a message at the point when connection close is invoked, all the facilities
> of the connection and its sessions must remain available to those listeners
> until they return control to the JMS provider.
> {quote}
> I assume that the above means that all JMS operations in
> MessageListener#onMessage(Message) should succeed including
> rollback/commit/acknowledge/recover.
> With current implementation such operations throws
> javax.jms.IllegalStateException: Object
> org.apache.qpid.client.AMQSession_0_10@54c01e99 has been closed
> {noformat}
> javax.jms.IllegalStateException: Object
> org.apache.qpid.client.AMQSession_0_10@54c01e99 has been closed
> at org.apache.qpid.client.Closeable.checkNotClosed(Closeable.java:69)
> at org.apache.qpid.client.AMQSession.checkNotClosed(AMQSession.java:578)
> at org.apache.qpid.client.AMQSession.getTransacted(AMQSession.java:1629)
> at
> org.apache.qpid.client.AMQSession.checkTransacted(AMQSession.java:2432)
> at org.apache.qpid.client.AMQSession.commit(AMQSession.java:850)
> at TestClient3$2.onMessage(TestClient3.java:69)
> at
> org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:751)
> at
> org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:141)
> at
> org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:725)
> at
> org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:186)
> at
> org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:1)
> at
> org.apache.qpid.client.AMQSession$Dispatcher.notifyConsumer(AMQSession.java:3475)
> at
> org.apache.qpid.client.AMQSession$Dispatcher.dispatchMessage(AMQSession.java:3414)
> at
> org.apache.qpid.client.AMQSession$Dispatcher.access$1(AMQSession.java:3377)
> at org.apache.qpid.client.AMQSession.dispatch(AMQSession.java:3194)
> at
> org.apache.qpid.client.message.UnprocessedMessage.dispatch(UnprocessedMessage.java:54)
> at
> org.apache.qpid.client.AMQSession$Dispatcher.run(AMQSession.java:3337)
> at java.lang.Thread.run(Thread.java:662)
> {noformat}
> The following code reproduces the issue
> {noformat}
> Properties properties = new Properties();
> properties.put("java.naming.factory.initial",
> "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
> properties.put("connectionfactory.local",
> "amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'");
> Context context = new InitialContext(properties);
> ConnectionFactory factory = (ConnectionFactory)
> context.lookup("local");
> Connection connection = factory.createConnection();
> connection.setExceptionListener(new ExceptionListener()
> {
> @Override
> public void onException(JMSException exception)
> {
> System.out.println("Exception listener");
> exception.printStackTrace();
> }
> });
> final Session session = connection.createSession(true,
> Session.SESSION_TRANSACTED);
> Destination destination = session.createQueue("test");
> MessageProducer producer = session.createProducer(destination);
> MessageConsumer consumer = session.createConsumer(destination);
> producer.send(session.createTextMessage("Test"));
> session.commit();
> final CountDownLatch countDownLatch = new CountDownLatch(1);
> consumer.setMessageListener(new MessageListener(){
> @Override
> public void onMessage(Message message)
> {
> countDownLatch.countDown();
> try
> {
> Thread.sleep(3000l);
> }
> catch (InterruptedException e)
> {
> e.printStackTrace();
> }
> try
> {
> session.commit();
> }
> catch (JMSException e)
> {
> e.printStackTrace();
> }
> }});
> connection.start();
> countDownLatch.await(1, TimeUnit.MINUTES);
> System.out.println("Closing connection before commit");
> connection.close();
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]