如何直接将标头中的值作为整数传递给size方法?
from(...).resequence(body()).batch().size(${pass_some_value_from_header_as_integer}).timeout(4000L).to(....)
感谢您的帮助。
答案 0 :(得分:0)
我认为您不能使用消息头字段来配置Resequencer,因为路由是一种“静态”路由,而消息头是可以为每条消息改变的运行时值。
如果该批次收集了50条消息,而下一个将批次大小设置为10,该怎么办?
尽管有我的疑问,但骆驼的BatchProcessor(重新排序器扩展了BatchProcessor)知道一个名为Exchange.BATCH_SIZE
的 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;
}