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 2b39fddef2
commit f5517a011c
3 changed files with 16 additions and 6 deletions

View File

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

View File

@@ -39,7 +39,7 @@ import org.springframework.messaging.MessagingException;
*/
public class NioFileLocker extends AbstractFileLockerFilter {
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<File, FileLock>();
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<>();
@Override
public boolean lock(File fileToLock) {
@@ -67,7 +67,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();

View File

@@ -18,20 +18,24 @@ package org.springframework.integration.file.locking;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
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 {
@@ -48,13 +52,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), is(testFile));
filter.lock(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
@@ -65,7 +74,8 @@ public class NioFileLockerTests {
testFile.createNewFile();
assertThat(filter1.filterFiles(workdir.listFiles()).get(0), is(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);
}
}