当前位置: 首页 > 知识库问答 >
问题:

如何在Spring批处理集成中使用文件锁?

沈俊晤
2023-03-14

在我的spring-batch-integration应用程序中,文件轮询调用eachfile的batchjob,该应用程序可以在多个服务器(节点)上运行,但它们都应该读取一个公共目录。代码如下

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读取该文件时,它给了我

共有1个答案

李森
2023-03-14

是的,您确实只能通过bytebuffer访问锁定的文件内容:

FileChannel fileChannel = channelCache.get(lockedFile);
ByteBuffer byteBuffer = ByteBuffer.allocate((int) fileChannel.size());
fileChannel.read(byteBuffer);
System.out.println("Read File " + lockedFile.getName() + " with content: " + new String(byteBuffer.array()));

哦!是啊。你真的指着我的回购:-)。

因此,对于Locker,您别无选择,除非在FlatFileItemReader之前以这种方式复制/粘贴文件Byte[],或者只是将一些自定义的BufferedReader插入到同一个FlatFileItemReader,后者将锁定的文件转换为适当的BufferedReader:

new BufferedReader(new CharArrayReader(byteBuffer.asCharBuffer().array()));
 类似资料:
  • 我正在处理非常大的文件,并使用Spring集成来处理它们。我想知道使用Spring集成和提供的DSL处理这些问题的最佳和最有效的方法是什么。我有一个测试CSV文件,它有大约30K条记录,我正在使用filespliter组件将每一行读入内存,然后根据分隔符再次拆分,以获得我需要的列。 下面的代码段。

  • 我有一个spring批处理应用程序,它从文件中读取数据,进行一些处理,最后编写一个定制的输出。这一切都是一步到位的。在下一步中,我将使用一个tasklet来归档输入文件(移动到另一个文件夹)。这个应用程序运行良好。但是,现在我需要在远程服务器上对sftp输出文件进行进一步处理。我找到了一种使用spring integration实现sftp的方法,在这里我创建了一个输入通道,该通道将反馈给outb

  • 如何使用java dsl Integrationflows从spring集成触发spring批处理作业。 我有下面的代码,它轮询目录中的文件,当新文件添加到目录中时,会生成一条消息,我想在该实例中触发一个Spring批处理作业。请建议。

  • 当RabbitMq消息到达队列时,我目前正在使用IntegrationFlow来触发作业执行。IntegrationFlow的AmqpInFronChannelAdapter和作业的第一步的ItemReader都配置为从同一队列中读取消息。 我遇到的问题是IntegrationFlow的AmqpInboundChannelAdapter读取RabbitMQ消息,然后ItemReader再也找不到该

  • 我正在使用jhipster,我想在我的WebApp中集成spring批处理管理控制台。(例如http://localhost:8080/batch-console) 我尝试在我的jhipster webapp中集成以下响应,有没有一种方法可以正确地集成spring-batch-admin和spring-boot?但我得到以下错误(属性似乎未加载) Spring Boot版本:1.4.1.发布Jhi

  • 需要读取spring批处理中的文件,对其进行处理并将其作为一个提要保存。一个提要包含50%的信息。当我必须持久化提要的最终结果时,我需要使用公共字段将它们组合起来,并像一个项目一样持久化。请参见下面的示例。 我需要保留的最终信息如下: 请建议我如何在我的Spring批工作中实现这一点。 谢谢