如何以动态方式将大小值传递给重新排序器?

时间:2018-12-04 20:14:43

标签: apache-camel

如何直接将标头中的值作为整数传递给size方法?

from(...).resequence(body()).batch().size(${pass_some_value_from_header_as_integer}).timeout(4000L).to(....)

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我认为您不能使用消息头字段来配置Resequencer,因为路由是一种“静态”路由,而消息头是可以为每条消息改变的运行时值。

如果该批次收集了50条消息,而下一个将批次大小设置为10,该怎么办?

尽管有我的疑问,但骆驼的BatchProcessor(重新排序器扩展了BatchProcessor)知道一个名为Exchange.BATCH_SIZE Exchange属性。

不知道这是否可行,但您可以尝试一下

  • 在路线中设置默认批次大小(初始值)
  • 无论何时要更改批处理大小,请在当前邮件上设置Exchange属性。显然,在您将消息发送给重新排序器之前。

设置交换属性

.setProperty(Exchange.BATCH_SIZE, "yourValue")

或者如果您想从邮件标题中获取值

.setProperty(Exchange.BATCH_SIZE, header("yourHeaderName"))

答案 1 :(得分:0)

非常感谢。现在,我已经通过使用聚合器来解决问题,该聚合器还对消息的顺序进行排序。我知道这可能不是仅解决方案的完美解决方案,但目前仍有效。我怎么会有时间尝试应用您的解决方案。

    @RequiredArgsConstructor
      class SampleEventRoute extends RouteBuilder {
        @Override
        public void configure() throws Exception {
          from(DIRECT_START)
              .process(exchange -> System.out.println("Input event : " + exchange.getIn().getBody()))
              .aggregate(header(CORRELATION_ID), new ResequencerStrategy())
              .completionSize(header(SIZE)) //here i can pass messages size in dynamic way
              .completionTimeout(2000)
              .log("${body}")
              .log("Completed by ${property.CamelAggregatedCompletedBy}")
              .split().body()
              .setBody(simple("${body.payload}"))
              .process(exchange -> System.out.println("Output event  : " + exchange.getIn().getBody()))
              .end();
        }
      }

@Value
class PayloadWrapper {

    private final String payload;
    private final int order;
    private final String correlationId;

}