【发布时间】:2016-05-10 23:24:52
【问题描述】:
在我的 spring-batch-integration 应用程序中,文件轮询为每个文件调用批处理作业,并且该应用程序可以在多个服务器(节点)上运行,但它们都应该读取一个公共目录。现在,我编写了一个自定义储物柜锁定文件,这样任何其他实例都无法处理同一个文件。代码如下
public class MyFileLocker extends AbstractFileLockerFilter{
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<File, FileLock>();
private final ConcurrentMap<File, FileChannel> ChannelCache = new ConcurrentHashMap<File, FileChannel>();
@Override
public boolean lock(File fileToLock) {
FileChannel channel;
FileLock lock;
try {
channel = new RandomAccessFile(fileToLock, "rw").getChannel();
lock = channel.tryLock();
if (lock == null || !lock.isValid()) {
System.out.println(" Problem in acquiring lock!!" + fileToLock);
return false;
}
lockCache.put(fileToLock, lock);
ChannelCache.put(fileToLock, channel);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
@Override
public boolean isLockable(File file) {
return file.canWrite();
}
@Override
public void unlock(File fileToUnlock) {
FileLock lock = lockCache.get(fileToUnlock);
try {
if(lock!=null){
lock.release();
ChannelCache.get(fileToUnlock).close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
现在,当我调用我的 Spring 批处理并尝试使用 flatfileitemreader 读取该文件时,它给了我
org.springframework.batch.item.file.NonTransientFlatFileException
我相信这是因为文件被锁定了。我做了一些谷歌搜索,发现 NIOLocker 以一种即使当前线程也无法读取文件的方式锁定文件。我找到了link,它显示了如何读取锁定的文件,但它们正在使用缓冲区。 如何让我的 FlatfileItemReader 可以访问我的文件。
请提出建议。
【问题讨论】:
标签: spring spring-integration spring-batch