diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java b/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java index a7ee18f883..8b462a5c5d 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java @@ -474,7 +474,7 @@ public class FileWritingMessageHandler extends AbstractReplyProducingMessageHand } @Override - public void stop() { + public synchronized void stop() { if (this.flushTask != null) { this.flushTask.cancel(true); this.flushTask = null; @@ -1005,7 +1005,7 @@ public class FileWritingMessageHandler extends AbstractReplyProducingMessageHand this.lock = lock; } - private void close() { + private boolean close() { try { this.lock.lockInterruptibly(); try { @@ -1019,9 +1019,11 @@ public class FileWritingMessageHandler extends AbstractReplyProducingMessageHand catch (IOException e) { // ignore } + return true; } catch (InterruptedException e1) { Thread.currentThread().interrupt(); + return false; } finally { this.lock.unlock(); @@ -1047,10 +1049,14 @@ public class FileWritingMessageHandler extends AbstractReplyProducingMessageHand FileState state = entry.getValue(); if (state.lastWrite < expired || (!FileWritingMessageHandler.this.flushWhenIdle && state.firstWrite < expired)) { - iterator.remove(); - state.close(); - if (FileWritingMessageHandler.this.logger.isDebugEnabled()) { - FileWritingMessageHandler.this.logger.debug("Flushed: " + entry.getKey()); + if (state.close()) { + if (FileWritingMessageHandler.this.logger.isDebugEnabled()) { + FileWritingMessageHandler.this.logger.debug("Flushed: " + entry.getKey()); + } + iterator.remove(); + } + else { + break; // interrupted } } }