如何在Spring Integration Java DSL中自定义消息聚合逻辑

时间:2017-07-27 19:09:00

标签: spring spring-boot spring-integration spring-integration-dsl

在集成流程中,具有默认策略的拆分会从列表中发出项目。处理该项目可能会失败。我想处理该错误并使用前一个(除了自定义错误标头)之外的映射信息将新消息定向到正常消息传递通道。

在聚合器中,我想自定义聚合逻辑,以生成其他类型的消息,其中包含失败进程的计数和未失败的消息的结果。

在这里,我将解释如何使用标题发送错误消息:

// Initiate the x-editable plugin
function get_editable() {
    $.fn.editable.defaults.mode = 'popup';
    $('.xedit').editable();
} 

 // Initiate the DataTable
table = $('#table').DataTable({
            option...
            drawCallback: function (settings) {
                get_editable();
            },
            option...
});

我希望聚合器生成这种类型的对象:

@Bean
public IntegrationFlow socialMediaErrorFlow() {
     return IntegrationFlows.from("socialMediaErrorChannel")
          .wireTap(sf -> sf.handle("errorService", "handleException"))
          .<MessagingException>handle((p, h)
               -> MessageBuilder.withPayload(Collections.<CommentEntity>emptyList())
                  .copyHeaders(p.getFailedMessage().getHeaders())
                  .setHeader("ERROR", true)
                  .build()
           )
           .channel("directChannel_1")
           .get();
}

我该如何处理?

提前感谢。

感谢Artem的帮助,我做了这个实现:

public class Result {

     private Integer totalTask;
     private Integer taskFailed;
     private List<CommentEntity> comments;

}

1 个答案:

答案 0 :(得分:2)

AggregatorSpecoutputProcessor属性:

/**
 * A processor to determine the output message from the released group. Defaults to a message
 * with a payload that is a collection of payloads from the input messages.
 * @param outputProcessor the processor.
 * @return the aggregator spec.
 */
public AggregatorSpec outputProcessor(MessageGroupProcessor outputProcessor) {

在这里,您可以提供自己的自定义逻辑来解析组中的所有邮件,并为它们构建Result

来自测试用例的样本:

.aggregate(a -> a.outputProcessor(g -> g.getMessages()
                        .stream()
                        .map(m -> (String) m.getPayload())
                        .collect(Collectors.joining(" "))))

Cafe Demo示例:

.aggregate(aggregator -> aggregator
        .outputProcessor(g ->
                    new Delivery(g.getMessages()
                                .stream()
                                .map(message -> (Drink) message.getPayload())
                                .collect(Collectors.toList())))
       .correlationStrategy(m -> ((Drink) m.getPayload()).getOrderNumber()))