使用aftercommit表达式将文件写入已处理的目录

68bkxrlz  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(317)

我的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;
}
xxls0lw8

xxls0lw81#

你只要记下来 smbMessageHandler 豆角 @ServiceActivator(inputChannel = "smbStoreChannel") 还有这个 ExpressionEvaluatingTransactionSynchronizationProcessor 可能只是有一个 setAfterRollbackChannel(smbStoreChannel) . 因此,当回滚发生时,一条失败的消息将被发送到 FileTransferringMessageHandler 将从通道中使用它,并可能发送到smb。也可以考虑使用 TransactionSynchronizationFactoryBean 为了方便。

相关问题