我的spring集成应用程序从fileshare读取文件,进行一些处理,包括api调用等。如果其间出现问题,我想使用afterrollbakexpression将文件写入文件共享/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);
}
我想做同样的事情,但是在回滚场景中将文件写入fileshare/ftp/sftp,而不是本地目录。
我有一个messagehandler,我调用它来使用集成流将文件写入smb fileshare。我不知道如何调用以下messagehandler作为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;
}
1条答案
按热度按时间xxls0lw81#
你只要记下来
smbMessageHandler
豆角@ServiceActivator(inputChannel = "smbStoreChannel")
还有这个ExpressionEvaluatingTransactionSynchronizationProcessor
可能只是有一个setAfterRollbackChannel(smbStoreChannel)
. 因此,当回滚发生时,一条失败的消息将被发送到FileTransferringMessageHandler
将从通道中使用它,并可能发送到smb。也可以考虑使用TransactionSynchronizationFactoryBean
为了方便。