Routing Spring集成:带标头的转换和路由

Routing Spring集成:带标头的转换和路由,routing,spring-integration,spring-integration-dsl,Routing,Spring Integration,Spring Integration Dsl,我正在构建一个基于Spring的库,在将消息转换为正确的类型后,它应该使用消息并将消息传递到已配置的通道。我的库可通过对列表“streamToConsume:FinalChannel Destination”进行配置 我想要一个IntegrationFlow如下: IntegrationFlows .from(kinesisInboundChannelAdapter(amazonKinesis(), streamNames)) .transform(new Iss

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

我想要一个
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;
  }
转换事件,然后将它们传递到配置中映射到流的通道。如何在转换后保留事件头以将其发送到正确的通道


谢谢你

我相信你的担心是,在
发行Transformer
之后,不再有理想的
AwsHeaders.STREAM
标题了。开发自定义转换器时,需要确保将所有头从请求消息传输到回复消息:与许多其他组件不同,transformer不会修改POJO的回复消息

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

MessageBuilder.withPayload(myPayload).copyHeadersIfAbsent(requestMessage.getHeaders()).build();
注意:您可以使用一个
AwsHeaders.RECEIVED_流
,因为这个流正是从
kinesismsessagedrivenchanneladapter
填充的:

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);
        }
private void performSend(AbstractIntegrationMessageBuilder messageBuilder,对象记录){
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);
}
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);
        }