springintegraton:在聚合器之后启动事务

7ivaypg9  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(345)

我必须以事务方式处理一组按名称聚合的文件:只需假设我有如下名称的输入文件: A1, A2, B1, B2, C1, C2, ... 我需要将它们分组如下: [A1, A2], [B1, B2], [C1, C2]... 我用ftp inboundadapter、聚合器和我的定制处理器制作了一个公共事务链,除了一个细节之外,它工作得非常完美。
当处理列表失败时,回滚spel只处理触发异常的单个文件,而我希望处理它所属的文件列表的异常。
我基本上(认为)我需要的是这样的东西:

+--+  +--+  +--+  +--+  +--+  +--+                       +------+  +------+  +------+
|A1|  |A2|  |B1|  |B2|  |C1|  |C2|     |aggregator| ->   |A1, A2|  |B1, B2|  |C1, C2|
+--+  +--+  +--+  +--+  +--+  +--+                       +------+  +------+  +------+

                                                       \-----------------------------/
                                                              transaction's scope

如果我只在聚合器之后启动事务,spel表达式将只看到列表消息而不是单个文件,对吗?
我不知道怎么做,是在不使用链中间的轮询器的情况下启动事务,这会引入延迟。
有什么提示吗?
谢谢您!
编辑:我已经解决了向处理句柄添加建议的问题,但我不能100%确定它是“正确”的解决方案

gblwokeq

gblwokeq1#

根据gary的建议,我采用了以下解决方案:

return IntegrationFlows
  .from(Ftp.inboundAdapter(ftpSessionFactory)
     // my FTP inbound adapter
  )
  .aggregate(a ->
     //  my aggregator strategy     
  )
  .handle(myAggregatedMessageProcessor(), c -> c.advice(myProcessorAdvice()))
  .get();

相关部分 c -> c.advice(processErrorAdvice()) 我还配置了如下建议:

@Bean
  Advice myProcessorAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setSuccessChannelName("successChannel");
        advice.setFailureChannelName("failedChannel");

        // this catches the Exceptions
        advice.setTrapException(true);
        return advice;
    }

相关问题