Передача переименованного файла в качестве ввода в исходящий адаптер / шлюз - PullRequest
0 голосов
/ 29 августа 2018

В приложении Spring-boot-Integration написал пользовательский шкафчик для переименования исходного файла перед блокировкой (fileToLock.getAbsolutePath () + ".lock") и ожидаемой блокировкой для файла, чтобы любой другой экземпляр не смог обработать тот же файл.

Когда файл переименовывается, он копирует содержимое из исходного файла и создает дополнительный файл с именем filename.lock с содержимым, а исходный файл также существует с размером 0 кбайт без содержимого.

Исходящий шлюз, принимающий исходный файл без содержимого и направляющий его на целевой путь.

Хотелось бы узнать, как переименовать исходный файл или как передать переименованный файл filename.lock в качестве входных данных для исходящего шлюза / адаптера.

 <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>

CustomFileLocker:

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();
    }
}
}

1 Ответ

0 голосов
/ 29 августа 2018

Как насчет этого до этого <file:outbound-gateway id="fileMover"> в цепочке:

<integration:transformer expression="new java.io.File(payload.absolutePath + '.lock')"/>

...