Alex Rudyy created QPID-4088:
--------------------------------
Summary: 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.16, 0.14, 0.12, 0.10, 0.8, 0.6, 0.17
Reporter: Alex Rudyy
Java JMS client does not fully conform JMS spec requirements 4.3.5 about
closing a connection:
{noformat}
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.
{noformat}
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 is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]