Spring集成-使用afterCommit表达式将文件写入已处理的目录
我的spring集成应用程序从文件共享中读取文件,进行一些处理,包括api调用等。如果其间出现问题,我希望使用AfterRollBak表达式将文件写入文件共享/ftp/sftp等中的失败目录 我发现了一个对本地文件目录执行相同操作的示例,如下所示Spring集成-使用afterCommit表达式将文件写入已处理的目录,spring,spring-boot,spring-integration,spring-integration-dsl,Spring,Spring Boot,Spring Integration,Spring Integration Dsl,我的spring集成应用程序从文件共享中读取文件,进行一些处理,包括api调用等。如果其间出现问题,我希望使用AfterRollBak表达式将文件写入文件共享/ftp/sftp等中的失败目录 我发现了一个对本地文件目录执行相同操作的示例,如下所示 @Bean TransactionSynchronizationFactory transactionSynchronizationFactory() { ExpressionParser parser = new SpelExpression
@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);
}
我想做同样的事情,但在回滚场景中将文件写入fileshare/ftp/sftp,而不是本地目录
我有一个messageHandler,我调用它使用集成流将文件写入smb文件共享。我不知道如何调用以下messagehandler作为AfterRollback表达式
@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;
}
@Bean(name=SMB\u文件\u错误\u消息\u处理程序)
public MessageHandler smbpessagehandler(){
FileTransferringMessageHandler处理程序=
新的FileTransferringMessageHandler(smbSessionFactory);
handler.setRemoteDirectoryExpression(
新的文字表达式(“/INPUT/ERROR”);
handler.setFileNameGenerator(m->
m、 getHeaders().get(FileHeaders.FILENAME,String.class)+“+”DateTimeFormatter.ofPattern(dateFormat).format(LocalDateTime.now());
setAutoCreateDirectory(true);
返回处理程序;
}
您只需使用@ServiceActivator(inputChannel=“smbStoreChannel”)
标记smbMessageHandler
bean,此表达式评估TransactionSynchronizationProcessor
可能只有一个setAfterRollbackChannel(smbStoreChannel)
。因此,当回滚发生时,一条失败的消息将被发送到该通道,您的FileTransferringMessageHandler
将从该通道使用该消息,并可能发送到SMB。为了方便起见,还可以考虑使用<代码>事务同步化Base<代码>。我这样做了,创建了一个SMBStureChanas作为一个直接通道。然后执行syncProcessor.setAfterRollbackChannel(通道);当我运行时,我得到的原因是:org.springframework.messaging.core.DestinationResolutionException:没有可用的输出通道或replyChannel头。另外,似乎没有处理程序。setExpectReply(false)可用于FileTransferringMessageHandler哦,对了!它是双向处理程序。因此,将outputChannel=“nullChannel”
添加到现在工作正常的@ServiceActivator