gpt4 book ai didi

java - 处理文件后通过 SftpOutboundGateway 删除文件

转载 作者:行者123 更新时间:2023-12-02 09:01:33 26 4
gpt4 key购买 nike

我正在使用 Spring Integration 从 SFTP 服务器读取文件,并且使用具有 Java 配置的 InboundChannelAdapter 一切正常。

现在,我想修改我的流程,以便从 SFTP 服务器中删除所有已处理的文件。因此,我想使用带有 Java 配置的 SFTP OutboundGateway。这是我的新代码,基于 https://docs.spring.io/spring-integration/docs/5.0.0.BUILD-SNAPSHOT/reference/html/sftp.html#sftp-outbound-gateway 进行了一些修改:

@Configuration
public class SftpConfiguration {

@Value("${sftp.host}")
String sftpHost = "";

@Value("${sftp.user}")
String sftpUser = "";

@Value("${sftp.pass}")
String sftpPass = "";

@Value("${sftp.port}")
Integer sftpPort = 0;

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost(sftpHost);
factory.setPort(sftpPort);
factory.setUser(sftpUser);
factory.setPassword(sftpPass);
factory.setAllowUnknownKeys(true);
return new CachingSessionFactory<LsEntry>(factory);
}

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
fileSynchronizer.setDeleteRemoteFiles(false);
fileSynchronizer.setRemoteDirectory("/upload/");
return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(cron = "0 * * * * ?"))
public MessageSource<File> sftpMessageSource() {
SftpInboundFileSynchronizingMessageSource source =
new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
source.setLocalDirectory(new File("sftp-folder"));
source.setAutoCreateLocalDirectory(true);
return source;
}

@Bean
@ServiceActivator(inputChannel = "sftpChannel")
MessageHandler handler() {
return new MessageHandler() {

@Override
public void handleMessage(Message<?> message) throws MessagingException {
File f = (File) message.getPayload();
try {
myProcessingClass.processFile(f);
SftpOutboundGateway sftpOG = new SftpOutboundGateway(sftpSessionFactory(), "rm",
"'/upload/" + f.getName() + "'");
} catch(QuoCrmException e) {
logger.error("File [ Process with errors, file won't be deleted: " + e.getMessage() + "]");
}
}

};
}

}

修改为:

  • 我将 fileSynchronizer 定义为 setDeleteRemoteFiles(false),以便根据我的流程手动删除文件。
  • 在我的 MessageHandler 中,我添加了 SFTPOutboundGateway,如果没有异常,则意味着处理成功并删除文件(但如果有异常则不会删除文件)。

此代码不会删除任何文件。有什么建议吗?

最佳答案

  1. 您不应为每个请求创建一个新网关(这正是您正在做的事情)。

  2. 无论如何,在创建 sftpOG 之后,您都不会对其执行任何操作;您需要向网关发送消息。

您可以创建一个回复生成处理程序,并将其输出 channel 连接到网关(应该是它自己的@Bean)。

或者,您可以简单地使用 SftpRemoteFileTemplate 来删除文件 - 但同样,您只需要一个文件,无需为每个请求创建一个新文件。

关于java - 处理文件后通过 SftpOutboundGateway 删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60121695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com