naveed created QPIDJMS-603: ------------------------------ Summary: Unsubscribing durable subscription with RabbitMQ fails Key: QPIDJMS-603 URL: https://issues.apache.org/jira/browse/QPIDJMS-603 Project: Qpid JMS Issue Type: Bug Components: qpid-jms-client Affects Versions: 2.6.1 Environment: Java 11
docker image for rabbitmq:management Apache Qpid JMS client 2.6.1 Reporter: naveed This issue occurs when using Apache Qpid JMS client library with RabbitMQ broker. When durable subscriptions are attempted to be unsubscribed from, it fails due to RabbitMQ's internal error. {noformat} jakarta.jms.JMSException: function_clause [{rabbit_amqp_session,ensure_source, [undefined,<<"/">>, {user,<<"guest">>, [administrator], [{rabbit_auth_backend_internal, #Fun<rabbit_auth_backend_internal.3.26105038>}]}, [],[]], [{file,"rabbit_amqp_session.erl"},{line,2544}]}, {rabbit_amqp_session,handle_attach,2, [{file,"rabbit_amqp_session.erl"},{line,1314}]}, {rabbit_amqp_session,handle_cast,2, [{file,"rabbit_amqp_session.erl"},{line,503}]}, {gen_server,try_handle_cast,3,[{file,"gen_server.erl"},{line,2371}]}, {gen_server,handle_msg,6,[{file,"gen_server.erl"},{line,2433}]}, {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,329}]}] [condition = amqp:internal-error]{noformat} Because of this failure, there's another issue, when the durable subscription is recreated with same connection and attempted to be unsubscribed again. The initial unsubscription failure does not seem to release a lock. Hence, if another durable subscription is created with a session created with same connection, this time the unsubscription gets stuck and keeps waiting for a lock on 'ProgressiveProviderFuture' instance. Below is the thread dump: {noformat} "ForkJoinPool.commonPool-worker-19" #49 daemon prio=5 os_prio=31 cpu=880.76ms elapsed=131.57s tid=0x00007fd2b7808800 nid=0x9407 in Object.wait() [0x0000700002fac000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(java.base@11.0.23/Native Method) - waiting on <0x000000061ca67fb8> (a org.apache.qpid.jms.provider.ProgressiveProviderFuture) at java.lang.Object.wait(java.base@11.0.23/Object.java:328) at org.apache.qpid.jms.provider.ProgressiveProviderFuture.sync(ProgressiveProviderFuture.java:154) - waiting to re-lock in wait() <0x000000061ca67fb8> (a org.apache.qpid.jms.provider.ProgressiveProviderFuture) at org.apache.qpid.jms.JmsConnection.unsubscribe(JmsConnection.java:826) at org.apache.qpid.jms.JmsConnection.unsubscribe(JmsConnection.java:815) at org.apache.qpid.jms.JmsSession.unsubscribe(JmsSession.java:646){noformat} However, if a new connection is created to recreate the durable subscription, there is no wait on the resource during unsubscription. However, the unsubscription failure still occur. This can be reproduced with following code: {code:java} import org.apache.qpid.jms.JmsConnectionFactory; import jakarta.jms.Connection; import jakarta.jms.JMSException; import jakarta.jms.MessageConsumer; import jakarta.jms.Session; public class DurableUnsubscriptionRunner { public static void main(String[] args) throws JMSException { final String subscriptionName = "testSubscription"; try (Connection connection = new JmsConnectionFactory("amqp://localhost:5672").createConnection()) { connection.setClientID("testClient"); Session session = connection.createSession(); MessageConsumer consumer = session .createDurableConsumer( session.createTopic("test-topic"), subscriptionName); connection.start(); consumer.close(); try { session.unsubscribe(subscriptionName); } catch (JMSException ex) { System.out.println("Failed unsubscription : " + ex); } session.close(); System.out.println("Recreating session"); session = connection.createSession(); consumer = session .createDurableConsumer( session.createTopic("test-topic"), subscriptionName); System.out.println("Closing all again"); consumer.close(); try { session.unsubscribe(subscriptionName); } catch (JMSException ex) { System.out.println("Failed unsubscription : " + ex); } System.out.println("Test completed"); } } } {code} -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org