From 8bb0e194c0732da40a5a669ef0e9ee4deddbd719 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Mon, 22 Jul 2019 15:10:18 -0400 Subject: [PATCH] Clear lock cache in NioFileLocker (#2998) Fixes https://github.com/spring-projects/spring-integration/issues/2980 --- .../file/locking/FileChannelCache.java | 2 +- .../integration/file/locking/NioFileLocker.java | 4 ++-- .../file/locking/NioFileLockerTests.java | 15 ++++++++++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java index 4c58605b01..781d85e628 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java @@ -34,7 +34,7 @@ import java.util.concurrent.ConcurrentMap; */ final class FileChannelCache { - private static ConcurrentMap channelCache = new ConcurrentHashMap(); + private static ConcurrentMap channelCache = new ConcurrentHashMap<>(); private FileChannelCache() { diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/NioFileLocker.java b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/NioFileLocker.java index 4f3e4a3533..1f4e8f63ff 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/NioFileLocker.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/NioFileLocker.java @@ -40,7 +40,7 @@ import org.springframework.messaging.MessagingException; */ public class NioFileLocker extends AbstractFileLockerFilter { - private final ConcurrentMap lockCache = new ConcurrentHashMap(); + private final ConcurrentMap lockCache = new ConcurrentHashMap<>(); @Override public boolean lock(File fileToLock) { @@ -68,7 +68,7 @@ public class NioFileLocker extends AbstractFileLockerFilter { @Override public void unlock(File fileToUnlock) { - FileLock fileLock = this.lockCache.get(fileToUnlock); + FileLock fileLock = this.lockCache.remove(fileToUnlock); try { if (fileLock != null) { fileLock.release(); diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java index d37ea157ef..3918f77aae 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java @@ -20,17 +20,20 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.List; +import java.util.Map; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.test.util.TestUtils; /** * @author Iwein Fuld + * @author Gary Russell */ public class NioFileLockerTests { @@ -47,13 +50,18 @@ public class NioFileLockerTests { }; @Test - public void fileListedByFirstFilter() throws IOException { + public void fileListedByFirstFilter() throws Exception { NioFileLocker filter = new NioFileLocker(); File testFile = new File(workdir, "test0"); testFile.createNewFile(); assertThat(filter.filterFiles(workdir.listFiles()).get(0)).isEqualTo(testFile); filter.lock(testFile); assertThat(filter.filterFiles(workdir.listFiles()).get(0)).isEqualTo(testFile); + filter.unlock(testFile); + Field channelCache = FileChannelCache.class.getDeclaredField("channelCache"); + channelCache.setAccessible(true); + assertThat(((Map) channelCache.get(null))).isEmpty(); + assertThat(((Map) TestUtils.getPropertyValue(filter, "lockCache", Map.class))).isEmpty(); } @Test @@ -64,7 +72,8 @@ public class NioFileLockerTests { testFile.createNewFile(); assertThat(filter1.filterFiles(workdir.listFiles()).get(0)).isEqualTo(testFile); filter1.lock(testFile); - assertThat(filter2.filterFiles(workdir.listFiles())).isEqualTo((List) new ArrayList()); + assertThat(filter2.filterFiles(workdir.listFiles())).isEqualTo(new ArrayList()); + filter1.unlock(testFile); } }