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([email protected]/Native Method)
- waiting on <0x000000061ca67fb8> (a
org.apache.qpid.jms.provider.ProgressiveProviderFuture)
at java.lang.Object.wait([email protected]/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: [email protected]
For additional commands, e-mail: [email protected]