Spring集成:使用头转换和路由

时间:2018-08-14 15:15:46

标签: routing spring-integration spring-integration-dsl

我正在构建一个基于Spring的库,在将消息转换为正确的类型后,该库应该使用消息并将消息传递到已配置的通道。我的库可通过“ streamToConsume:FinalChannelDestination”对列表进行配置

streams:
    source: destinationChannel

我想像下面这样IntegrationFlow

IntegrationFlows
        .from(kinesisInboundChannelAdapter(amazonKinesis(), streamNames))
        .transform(new IssuanceTransformer())
        .route(router())
        .get();

public HeaderValueRouter router() {
    HeaderValueRouter router = new HeaderValueRouter(AwsHeaders.STREAM);
    consumerClientProperties.getKinesis().getStreams().forEach((k, v) ->
        router.setChannelMapping(k, v)
    );
    return router;
  }

转换事件,然后将其传递到映射到配置中流的通道。转换后如何保留事件标头才能将其发送到正确的频道?

谢谢

1 个答案:

答案 0 :(得分:1)

我相信您担心,在IssuanceTransformer之后不再有所需的AwsHeaders.STREAM标头。开发自定义转换器时,需要确保将所有标头从请求消息转移到回复消息:与许多其他组件不同,转换器不会修改POJO的回复消息。

为此,您可以使用以下内容:

MessageBuilder.withPayload(myPayload).copyHeadersIfAbsent(requestMessage.getHeaders()).build();

注意:您可以使用AwsHeaders.RECEIVED_STREAM,因为正是这个KinesisMessageDrivenChannelAdapter填充了:

private void performSend(AbstractIntegrationMessageBuilder<?> messageBuilder, Object rawRecord) {
        messageBuilder.setHeader(AwsHeaders.RECEIVED_STREAM, this.shardOffset.getStream())
                .setHeader(AwsHeaders.SHARD, this.shardOffset.getShard());

        if (CheckpointMode.manual.equals(KinesisMessageDrivenChannelAdapter.this.checkpointMode)) {
            messageBuilder.setHeader(AwsHeaders.CHECKPOINTER, this.checkpointer);
        }