Routing Spring集成:带标头的转换和路由
我正在构建一个基于Spring的库,在将消息转换为正确的类型后,它应该使用消息并将消息传递到已配置的通道。我的库可通过对列表“streamToConsume:FinalChannel Destination”进行配置 我想要一个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
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);
}