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