我正在构建一个基于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;
}
转换事件,然后将其传递到映射到配置中流的通道。转换后如何保留事件标头才能将其发送到正确的频道?
谢谢
答案 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);
}