确定 FileWrittenEvent 何时完成写入整个文件

Determining when FileWrittenEvent has completed writing the entire file

这是我的第一个问题,所以请耐心等待。
在最近发布的 Spring 5.2 中,Spring 集成中添加了一些非常有用的组件,如图所示在这个 link:
https://docs.spring.io/spring-integration/reference/html/sftp.html#sftp-server-events
Apache MINA 中集成了一个新的侦听器 "ApacheMinaSftpEventListener"

listens for certain Apache Mina SFTP server events and publishes them as ApplicationEvents

到目前为止,我的应用程序可以捕获所提供的 link 文档中所述的应用程序事件,但我似乎无法弄清楚事件何时结束......如果这有意义(可能不).

在流程中,应用程序启动并激活为指定端口上的 SFTP 服务器。
我可以使用用户名和密码连接到 "put" 系统上启动传输的文件。
当我登录时,我可以捕获 "SessionOpenedEvent"
当我传输文件时,我可以捕获 "FileWrittenEvent"
当我注销或断开连接时,我可以捕获 "SessionClosedEvent"
当文件较大时,我可以捕获所有 "FileWrittenEvent" 事件,这些事件告诉我传输发生在预定或计算大小的缓冲区的流上。

我要确定的是 "How can I find out when that stream is finished"。这将帮助我回答 "As an SFTP Server accepting a file, when can I access the completed file?"

我的监听器 bean(通过 SubSystemFactory 连接到 Apache Mina)

@Configuration
public class SftpConfiguration {
    @Bean
    public ApacheMinaSftpEventListener apacheMinaSftpEventListener() {
        return new ApacheMinaSftpEventListener();
    }   
}
SftpSubsystemFactory subSystem = new SftpSubsystemFactory();
subSystem.addSftpEventListener(listener);

我的事件侦听器:这是为了让我可以在记录器中看到一些输出,当我意识到,在几 GB 的文件上,FileWrittenEvent 变得有点疯狂。

@Async
@EventListener
public void sftpEventListener(ApacheMinaSftpEvent sftpEvent) {
    log.info("Capturing Event: ", sftpEvent.getClass().getSimpleName());
    log.info("Event Details: ", sftpEvent.toString());
}

这几部分是我开始捕获事件真正需要的全部内容

我在想我需要重写一个方法来帮助我在流结束时进行捕获,这样我就可以继续我的业务逻辑,但我不确定是哪一个。
我似乎能够在流完成之前访问文件 (read/write),所以我似乎没有能够使用尝试 "move" 文件并等待它抛出错误的逻辑,尽管这种方法对我来说似乎是不好的做法。

任何指导将不胜感激,谢谢。

版本信息

这可能对其他人没有帮助,但我找到了解决我最初问题的方法,方法是将相关解决方案与新的 Apache MINA 相结合 classes 在这个答案中找到:

我的解决方案:
创建一个扩展新 ApacheMinaSftpEventListener 的 class,同时覆盖 'open' 和 'close' 方法,以确保我的 SFTP 服务器业务逻辑知道文件何时写入。

public class WatcherSftpEventListener extends ApacheMinaSftpEventListener {
    ...
    ...
    @Override public void open(ServerSession session, String remoteHandle, Handle localHandle) throws IOException {
        File file = localHandle.getFile().toFile();
        if (file.isFile() && file.exists()) {
            log.debug("File Open: {}", file.toString());
        }
        // Keep around the super call for now
        super.open(session, remoteHandle, localHandle);
    }

    @Override
    public void close(ServerSession session, String remoteHandle, Handle localHandle) {
        File file = localHandle.getFile().toFile();
        if (file.isFile() && file.exists()) {
            log.debug("RemoteHandle: {}", remoteHandle);
            log.debug("File Closed: {}", file.toString());
            for (SftpFileUploadCompleteListener listener : fileReadyListeners) {
                try {
                    listener.onFileReady(file);
                } catch (Exception e) {
                    String msg = String.format("File '%s' caused an error in processing '%s'", file.getName(), e.getMessage());
                    log.error(msg);
                    try {
                        session.disconnect(0, msg);
                    } catch (IOException io) {
                        log.error("Could not properly disconnect from session {}; closing future state", session);
                        session.close(false);
                    }
                }
            }
        }
        // Keep around the super call for now
        super.close(session, remoteHandle, localHandle);
    }

}

当我启动 SSHD 服务器时,我将我的新侦听器 bean 添加到 SftpSubsystemFactory,它使用自定义事件处理程序 class 对传入文件应用我的业务逻辑。

        watcherSftpEventListener.addFileReadyListener(new SftpFileUploadCompleteListener() {
            @Override
            public void onFileReady(File file) throws Exception {
                new WatcherSftpEventHandler(file, properties.getSftphost());
            }
        });
        subSystem.addSftpEventListener(watcherSftpEventListener);

这个解决方案还有很多内容,但是由于这个问题没有那么多的访问量,而且现在更多的是供我参考和学习,所以除非有人问,否则我不会提供更多内容。