我的要求是从 FTP 远程目录读取文件,将有效负载值插入数据库,然后将文件从远程目录 /in 移动到同一 FTP 服务器的远程目录 /archive。
我正在使用 spring 集成 @InboundChannelAdapter 并能够调用 ExpressionEvaluatingTransactionSynchronizationProcessor setAfterCommitExpression。我正在努力寻找一种方法来构造 spel 解析表达式以从入站远程目录移动到另一个目录。
setAfterCommitExpression
是针对 Message
作为根对象执行的。
该消息正是 FtpInboundFileSynchronizingMessageSource
所产生的。该消息的有效负载是FTPFile
。还有一些额外的标题:
messageBuilder.setHeader(FileHeaders.REMOTE_HOST_PORT, uri.getHost() + ':' + uri.getPort())
.setHeader(FileHeaders.REMOTE_DIRECTORY, uri.getPath())
.setHeader(FileHeaders.REMOTE_FILE, uri.getFragment());
因此,您可以从该表达式(如
@myFtpMoveService.moveRemoteFile(#root)
)调用某些服务,并在该方法中接受 Message
以及确定远程文件、其名称和目录所需的所有信息。
我创建了一个消息网关
@MessagingGateway
public interface FtpGateway {
@Gateway(requestChannel = "ftpChannel")
void sendFile(File file);
}
和@ServiceActivator
@Bean
@ServiceActivator(inputChannel = "ftpChannel")
public MessageHandler ftpFileTransferMessageHandler() {
// MessageHandler config..
}
并为 TransactionSynchronizationFactory 中的 setAfterCommitExpression 提供 @Gateway 方法
"@ftpGateway.sendFileToArchive(payload)")
作为 SPEL
spelParser.parseExpression("@ftpGateway.sendFileToArchive(payload)"));