Skip to content

Commit aa94239

Browse files
committed
Set synchronized for the close method and modified the stopping of the EnquireLinkSender, to fix deadlock in Apache Camel.
1 parent bb11d4d commit aa94239

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

jsmpp/src/main/java/org/jsmpp/session/AbstractSession.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,23 +200,24 @@ public DataSmResult dataShortMessage(String serviceType,
200200
return new DataSmResult(resp.getMessageId(), resp.getOptionalParameters());
201201
}
202202

203-
public void close() {
203+
public synchronized void close() {
204204
logger.debug("Close session {}", sessionId);
205205
SessionContext ctx = sessionContext();
206-
if (!ctx.getSessionState().equals(SessionState.CLOSED)) {
207-
ctx.close();
206+
SessionState sessionState = ctx.getSessionState();
207+
if (!sessionState.equals(SessionState.CLOSED)) {
208208
try {
209209
connection().close();
210210
} catch (IOException e) {
211+
logger.warn("Failed to close connection: {}", e.getMessage());
211212
}
212213
}
213214

214215
// Make sure the enquireLinkThread doesn't wait for itself
215216
if (Thread.currentThread() != enquireLinkSender) {
216-
logger.debug("Closing enquireLinkSender for session {}", sessionId);
217+
logger.debug("Stop enquireLinkSender for session {}", sessionId);
217218
if (enquireLinkSender != null) {
218-
enquireLinkSender.interrupt();
219219
try {
220+
enquireLinkSender.interrupt();
220221
enquireLinkSender.join();
221222
} catch (InterruptedException e) {
222223
Thread.currentThread().interrupt();
@@ -225,6 +226,11 @@ public void close() {
225226
}
226227
}
227228

229+
if (!sessionState.equals(SessionState.CLOSED)) {
230+
logger.debug("Close session context {} in state {}", sessionId, sessionState);
231+
ctx.close();
232+
}
233+
228234
logger.debug("Session {} is closed and enquireLinkSender stopped", sessionId);
229235
}
230236

@@ -457,17 +463,17 @@ public EnquireLinkSender()
457463
public void run() {
458464
logger.info("Starting EnquireLinkSender for session {}", sessionId);
459465
while (isReadPdu()) {
460-
while (!sendingEnquireLink.compareAndSet(true, false) && isReadPdu()) {
466+
while (!sendingEnquireLink.compareAndSet(true, false) && !Thread.currentThread().isInterrupted() && isReadPdu()) {
461467
synchronized (sendingEnquireLink) {
462468
try {
463469
sendingEnquireLink.wait(500);
464470
} catch (InterruptedException e) {
465471
Thread.currentThread().interrupt();
466-
throw new RuntimeException("Interrupted");
472+
break;
467473
}
468474
}
469475
}
470-
if (!isReadPdu()) {
476+
if (Thread.currentThread().isInterrupted() || !isReadPdu()) {
471477
break;
472478
}
473479
try {

0 commit comments

Comments
 (0)