Spring 集成 - 使用 afterCommit 表达式将文件写入已处理的目录
Spring integration - Use afterCommit expression to write file to a processed directory
我的 spring 集成应用程序从文件共享中读取文件,进行一些处理,包括 api 调用等。如果中间出现问题,我想使用 afterRollbakExpression 将文件写入文件中的失败目录 share/ftp/sftp 等
我找到了一个对本地文件目录执行相同操作的示例,如下所示,
@Bean
TransactionSynchronizationFactory transactionSynchronizationFactory() {
ExpressionParser parser = new SpelExpressionParser();
ExpressionEvaluatingTransactionSynchronizationProcessor syncProcessor =
new ExpressionEvaluatingTransactionSynchronizationProcessor();
syncProcessor.setBeanFactory(applicationContext.getAutowireCapableBeanFactory());
//afterCommit expression moves the file to a processed directory
syncProcessor.setAfterCommitExpression(parser.parseExpression("payload.renameTo(new java.io.File(@inboundProcessedDirectory.path "
+ " + T(java.io.File).separator + payload.name))"));
//afterRollback expression moves the file to a failed directory
syncProcessor.setAfterRollbackExpression(parser.parseExpression("payload.renameTo(new java.io.File(@inboundFailedDirectory.path "
+ " + T(java.io.File).separator + payload.name))"));
return new DefaultTransactionSynchronizationFactory(syncProcessor);
}
我想做同样的事情,但在回滚情况下将文件写入文件share/ftp/sftp,而不是本地目录。
我有一个 messageHandler,我调用它来使用集成流将文件写入 smb 文件共享。我不知道如何调用以下消息处理程序作为 AfterRollbackExpression,
@Bean(name = SMB_FILE_ERROR_MESSAGE_HANDLER)
public MessageHandler smbMessageHandler() {
FileTransferringMessageHandler<SmbFile> handler =
new FileTransferringMessageHandler<>(smbSessionFactory);
handler.setRemoteDirectoryExpression(
new LiteralExpression("/INPUT/ERROR"));
handler.setFileNameGenerator(m ->
m.getHeaders().get(FileHeaders.FILENAME, String.class) + "." + DateTimeFormatter.ofPattern(dateFormat).format(LocalDateTime.now()));
handler.setAutoCreateDirectory(true);
return handler;
}
您只需用 @ServiceActivator(inputChannel = "smbStoreChannel")
标记那个 smbMessageHandler
bean,而这个 ExpressionEvaluatingTransactionSynchronizationProcessor
可能只有一个 setAfterRollbackChannel(smbStoreChannel)
。因此,当回滚发生时,一条失败的消息将被发送到该通道,您的 FileTransferringMessageHandler
将从该通道使用它并可能发送到 SMB。为了方便起见,还可以考虑使用 TransactionSynchronizationFactoryBean
。
我的 spring 集成应用程序从文件共享中读取文件,进行一些处理,包括 api 调用等。如果中间出现问题,我想使用 afterRollbakExpression 将文件写入文件中的失败目录 share/ftp/sftp 等
我找到了一个对本地文件目录执行相同操作的示例,如下所示,
@Bean
TransactionSynchronizationFactory transactionSynchronizationFactory() {
ExpressionParser parser = new SpelExpressionParser();
ExpressionEvaluatingTransactionSynchronizationProcessor syncProcessor =
new ExpressionEvaluatingTransactionSynchronizationProcessor();
syncProcessor.setBeanFactory(applicationContext.getAutowireCapableBeanFactory());
//afterCommit expression moves the file to a processed directory
syncProcessor.setAfterCommitExpression(parser.parseExpression("payload.renameTo(new java.io.File(@inboundProcessedDirectory.path "
+ " + T(java.io.File).separator + payload.name))"));
//afterRollback expression moves the file to a failed directory
syncProcessor.setAfterRollbackExpression(parser.parseExpression("payload.renameTo(new java.io.File(@inboundFailedDirectory.path "
+ " + T(java.io.File).separator + payload.name))"));
return new DefaultTransactionSynchronizationFactory(syncProcessor);
}
我想做同样的事情,但在回滚情况下将文件写入文件share/ftp/sftp,而不是本地目录。
我有一个 messageHandler,我调用它来使用集成流将文件写入 smb 文件共享。我不知道如何调用以下消息处理程序作为 AfterRollbackExpression,
@Bean(name = SMB_FILE_ERROR_MESSAGE_HANDLER)
public MessageHandler smbMessageHandler() {
FileTransferringMessageHandler<SmbFile> handler =
new FileTransferringMessageHandler<>(smbSessionFactory);
handler.setRemoteDirectoryExpression(
new LiteralExpression("/INPUT/ERROR"));
handler.setFileNameGenerator(m ->
m.getHeaders().get(FileHeaders.FILENAME, String.class) + "." + DateTimeFormatter.ofPattern(dateFormat).format(LocalDateTime.now()));
handler.setAutoCreateDirectory(true);
return handler;
}
您只需用 @ServiceActivator(inputChannel = "smbStoreChannel")
标记那个 smbMessageHandler
bean,而这个 ExpressionEvaluatingTransactionSynchronizationProcessor
可能只有一个 setAfterRollbackChannel(smbStoreChannel)
。因此,当回滚发生时,一条失败的消息将被发送到该通道,您的 FileTransferringMessageHandler
将从该通道使用它并可能发送到 SMB。为了方便起见,还可以考虑使用 TransactionSynchronizationFactoryBean
。