Clear lock cache in NioFileLocker (#2998)

Fixes https://github.com/spring-projects/spring-integration/issues/2980
# Conflicts:
#	spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java
This commit is contained in:
Gary Russell
2019-07-22 15:10:18 -04:00
committed by Artem Bilan
parent e161f6460c
commit 1e38ff7b0e
3 changed files with 16 additions and 6 deletions

View File

@@ -34,7 +34,7 @@ import java.util.concurrent.ConcurrentMap;
*/ */
final class FileChannelCache { final class FileChannelCache {
private static ConcurrentMap<File, FileChannel> channelCache = new ConcurrentHashMap<File, FileChannel>(); private static ConcurrentMap<File, FileChannel> channelCache = new ConcurrentHashMap<>();
private FileChannelCache() { private FileChannelCache() {

View File

@@ -40,7 +40,7 @@ import org.springframework.messaging.MessagingException;
*/ */
public class NioFileLocker extends AbstractFileLockerFilter { public class NioFileLocker extends AbstractFileLockerFilter {
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<File, FileLock>(); private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<>();
@Override @Override
public boolean lock(File fileToLock) { public boolean lock(File fileToLock) {
@@ -68,7 +68,7 @@ public class NioFileLocker extends AbstractFileLockerFilter {
@Override @Override
public void unlock(File fileToUnlock) { public void unlock(File fileToUnlock) {
FileLock fileLock = this.lockCache.get(fileToUnlock); FileLock fileLock = this.lockCache.remove(fileToUnlock);
try { try {
if (fileLock != null) { if (fileLock != null) {
fileLock.release(); fileLock.release();

View File

@@ -18,20 +18,24 @@ package org.springframework.integration.file.locking;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.Map;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.file.filters.FileListFilter;
import org.springframework.integration.test.util.TestUtils;
/** /**
* @author Iwein Fuld * @author Iwein Fuld
* @author Gary Russell
*/ */
public class NioFileLockerTests { public class NioFileLockerTests {
@@ -48,13 +52,18 @@ public class NioFileLockerTests {
}; };
@Test @Test
public void fileListedByFirstFilter() throws IOException { public void fileListedByFirstFilter() throws Exception {
NioFileLocker filter = new NioFileLocker(); NioFileLocker filter = new NioFileLocker();
File testFile = new File(workdir, "test0"); File testFile = new File(workdir, "test0");
testFile.createNewFile(); testFile.createNewFile();
assertThat(filter.filterFiles(workdir.listFiles()).get(0), is(testFile)); assertThat(filter.filterFiles(workdir.listFiles()).get(0), is(testFile));
filter.lock(testFile); filter.lock(testFile);
assertThat(filter.filterFiles(workdir.listFiles()).get(0), is(testFile)); assertThat(filter.filterFiles(workdir.listFiles()).get(0), is(testFile));
filter.unlock(testFile);
Field channelCache = FileChannelCache.class.getDeclaredField("channelCache");
channelCache.setAccessible(true);
assertTrue(((Map<?, ?>) channelCache.get(null)).isEmpty());
assertTrue(TestUtils.getPropertyValue(filter, "lockCache", Map.class).isEmpty());
} }
@Test @Test
@@ -65,7 +74,8 @@ public class NioFileLockerTests {
testFile.createNewFile(); testFile.createNewFile();
assertThat(filter1.filterFiles(workdir.listFiles()).get(0), is(testFile)); assertThat(filter1.filterFiles(workdir.listFiles()).get(0), is(testFile));
filter1.lock(testFile); filter1.lock(testFile);
assertThat(filter2.filterFiles(workdir.listFiles()), is((List<File>) new ArrayList<File>())); assertThat(filter2.filterFiles(workdir.listFiles()), is(new ArrayList<File>()));
filter1.unlock(testFile);
} }
} }