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:
committed by
Artem Bilan
parent
e161f6460c
commit
1e38ff7b0e
@@ -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() {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user