@@ -200,23 +200,24 @@ public DataSmResult dataShortMessage(String serviceType,
200
200
return new DataSmResult (resp .getMessageId (), resp .getOptionalParameters ());
201
201
}
202
202
203
- public void close () {
203
+ public synchronized void close () {
204
204
logger .debug ("Close session {}" , sessionId );
205
205
SessionContext ctx = sessionContext ();
206
- if (! ctx .getSessionState (). equals ( SessionState . CLOSED )) {
207
- ctx . close ();
206
+ SessionState sessionState = ctx .getSessionState ();
207
+ if (! sessionState . equals ( SessionState . CLOSED )) {
208
208
try {
209
209
connection ().close ();
210
210
} catch (IOException e ) {
211
+ logger .warn ("Failed to close connection: {}" , e .getMessage ());
211
212
}
212
213
}
213
214
214
215
// Make sure the enquireLinkThread doesn't wait for itself
215
216
if (Thread .currentThread () != enquireLinkSender ) {
216
- logger .debug ("Closing enquireLinkSender for session {}" , sessionId );
217
+ logger .debug ("Stop enquireLinkSender for session {}" , sessionId );
217
218
if (enquireLinkSender != null ) {
218
- enquireLinkSender .interrupt ();
219
219
try {
220
+ enquireLinkSender .interrupt ();
220
221
enquireLinkSender .join ();
221
222
} catch (InterruptedException e ) {
222
223
Thread .currentThread ().interrupt ();
@@ -225,6 +226,11 @@ public void close() {
225
226
}
226
227
}
227
228
229
+ if (!sessionState .equals (SessionState .CLOSED )) {
230
+ logger .debug ("Close session context {} in state {}" , sessionId , sessionState );
231
+ ctx .close ();
232
+ }
233
+
228
234
logger .debug ("Session {} is closed and enquireLinkSender stopped" , sessionId );
229
235
}
230
236
@@ -457,17 +463,17 @@ public EnquireLinkSender()
457
463
public void run () {
458
464
logger .info ("Starting EnquireLinkSender for session {}" , sessionId );
459
465
while (isReadPdu ()) {
460
- while (!sendingEnquireLink .compareAndSet (true , false ) && isReadPdu ()) {
466
+ while (!sendingEnquireLink .compareAndSet (true , false ) && ! Thread . currentThread (). isInterrupted () && isReadPdu ()) {
461
467
synchronized (sendingEnquireLink ) {
462
468
try {
463
469
sendingEnquireLink .wait (500 );
464
470
} catch (InterruptedException e ) {
465
471
Thread .currentThread ().interrupt ();
466
- throw new RuntimeException ( "Interrupted" ) ;
472
+ break ;
467
473
}
468
474
}
469
475
}
470
- if (!isReadPdu ()) {
476
+ if (Thread . currentThread (). isInterrupted () || !isReadPdu ()) {
471
477
break ;
472
478
}
473
479
try {
0 commit comments