将重命名的文件作为输入传递给出站 adapter/gateway
Passing renamed file as input to Outbound adapter/gateway
在 spring-boot-integration 应用程序中,编写了一个自定义储物柜以在锁定之前重命名原始文件(fileToLock.getAbsolutePath() + ".lock")和预期的文件锁定,以便任何其他实例将无法处理同一个文件。
重命名文件时,它会复制原始文件的内容,并使用 filename.lock 创建附加文件,其中包含内容,原始文件也存在,大小为 0 kb,没有内容。
出站网关将没有内容的原始文件作为输入并将其路由到目标路径。
想知道如何重命名原始文件,或者如何将重命名的文件 filename.lock 作为输入传递给出站 gateway/adapter。
<integration:chain id="filesOutChain" input-channel="filesOutChain">
<file:outbound-gateway id="fileMover"
auto-create-directory="true"
directory-expression="headers.TARGET_PATH"
mode="REPLACE">
<file:request-handler-advice-chain>
<ref bean="retryAdvice" />
</file:request-handler-advice-chain>
</file:outbound-gateway>
<integration:gateway request-channel="filesOutchainChannel" error-channel="errorChannel"/>
</integration:chain>
自定义文件锁:
public class CustomFileLocker 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 {
boolean fileRename =fileToLock.renameTo(new File(fileToLock.getAbsolutePath() + ".lock"));
if(fileRename)
{
channel = new RandomAccessFile(fileToLock, "rw").getChannel();
lock = channel.tryLock();
if (lock == null || !lock.isValid()) {
System.out.println(" Problem in acquiring lock!!" + fileToLock.getName());
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) {
e.printStackTrace();
}
}
}
链中 <file:outbound-gateway id="fileMover">
之前的这个如何:
<integration:transformer expression="new java.io.File(payload.absolutePath + '.lock')"/>
?
在 spring-boot-integration 应用程序中,编写了一个自定义储物柜以在锁定之前重命名原始文件(fileToLock.getAbsolutePath() + ".lock")和预期的文件锁定,以便任何其他实例将无法处理同一个文件。
重命名文件时,它会复制原始文件的内容,并使用 filename.lock 创建附加文件,其中包含内容,原始文件也存在,大小为 0 kb,没有内容。
出站网关将没有内容的原始文件作为输入并将其路由到目标路径。
想知道如何重命名原始文件,或者如何将重命名的文件 filename.lock 作为输入传递给出站 gateway/adapter。
<integration:chain id="filesOutChain" input-channel="filesOutChain">
<file:outbound-gateway id="fileMover"
auto-create-directory="true"
directory-expression="headers.TARGET_PATH"
mode="REPLACE">
<file:request-handler-advice-chain>
<ref bean="retryAdvice" />
</file:request-handler-advice-chain>
</file:outbound-gateway>
<integration:gateway request-channel="filesOutchainChannel" error-channel="errorChannel"/>
</integration:chain>
自定义文件锁:
public class CustomFileLocker 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 {
boolean fileRename =fileToLock.renameTo(new File(fileToLock.getAbsolutePath() + ".lock"));
if(fileRename)
{
channel = new RandomAccessFile(fileToLock, "rw").getChannel();
lock = channel.tryLock();
if (lock == null || !lock.isValid()) {
System.out.println(" Problem in acquiring lock!!" + fileToLock.getName());
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) {
e.printStackTrace();
}
}
}
链中 <file:outbound-gateway id="fileMover">
之前的这个如何:
<integration:transformer expression="new java.io.File(payload.absolutePath + '.lock')"/>
?