Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

import java.math.BigInteger;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import jakarta.jms.Destination;
import jakarta.jms.JMSException;
Expand Down Expand Up @@ -98,7 +100,13 @@ public void setReplyToSelectorHeader(org.apache.camel.Message camelMessage, Mess

private final class DestinationResolverDelegate implements DestinationResolver {
private final DestinationResolver delegate;
private Destination destination;
// Use a dedicated lock instead of BaseService.lock to avoid deadlock
// during shutdown: BaseService.stop() holds its lock while calling
// doStop() -> listenerContainer.destroy() -> doShutdown() which waits
// for listener threads to finish. If a listener thread needs to resolve
// the destination, it would deadlock trying to acquire BaseService.lock.
private final Lock destinationLock = new ReentrantLock();
private volatile Destination destination;

DestinationResolverDelegate(DestinationResolver delegate) {
this.delegate = delegate;
Expand All @@ -109,15 +117,20 @@ public Destination resolveDestinationName(
Session session, String destinationName,
boolean pubSubDomain)
throws JMSException {
QueueReplyManager.this.lock.lock();
// fast path: destination already resolved
Destination answer = destination;
if (answer != null) {
return answer;
}
destinationLock.lock();
try {
// resolve the reply to destination
if (destination == null) {
destination = delegate.resolveDestinationName(session, destinationName, pubSubDomain);
setReplyTo(destination);
}
} finally {
QueueReplyManager.this.lock.unlock();
destinationLock.unlock();
}
return destination;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
*/
package org.apache.camel.component.sjms.reply;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import jakarta.jms.Destination;
import jakarta.jms.JMSException;
import jakarta.jms.Message;
Expand Down Expand Up @@ -65,23 +68,31 @@ protected void handleReplyMessage(String correlationID, Message message, Session

private final class DestinationResolverDelegate implements DestinationCreationStrategy {
private final DestinationCreationStrategy delegate;
private Destination destination;
// Use a dedicated lock instead of BaseService.lock to avoid deadlock
// during shutdown (same issue as CAMEL-23194 in camel-jms)
private final Lock destinationLock = new ReentrantLock();
private volatile Destination destination;

DestinationResolverDelegate(DestinationCreationStrategy delegate) {
this.delegate = delegate;
}

@Override
public Destination createDestination(Session session, String destinationName, boolean topic) throws JMSException {
QueueReplyManager.this.lock.lock();
// fast path: destination already resolved
Destination answer = destination;
if (answer != null) {
return answer;
}
destinationLock.lock();
try {
// resolve the reply to destination
if (destination == null) {
destination = delegate.createDestination(session, destinationName, topic);
setReplyTo(destination);
}
} finally {
QueueReplyManager.this.lock.unlock();
destinationLock.unlock();
}
return destination;
}
Expand Down
Loading