Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring集成-使用afterCommit表达式将文件写入已处理的目录_Spring_Spring Boot_Spring Integration_Spring Integration Dsl - Fatal编程技术网

Spring集成-使用afterCommit表达式将文件写入已处理的目录

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

我的spring集成应用程序从文件共享中读取文件,进行一些处理,包括api调用等。如果其间出现问题,我希望使用AfterRollBak表达式将文件写入文件共享/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文件共享。我不知道如何调用以下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