我是Spring Integration的新手,使用Java 7,在迁移到Spring集成DSL之前我有这个xml配置,我的应用程序正在努力丰富一个带有随机UUID生成的监控ID的标头(这是关联请求和响应以便以后在日志中搜索,也许这可以用不同的方式完成,不知道):
<int:chain input-channel="requestChannel" output-channel="responseChannel">
<int:header-enricher>
<int:header name="translator-monitoringId" expression="T(java.util.UUID).randomUUID()"/>
</int:header-enricher>
<int:transformer ref="customHeaderTransformerBean" method="convertToJson"/>
<int-amqp:outbound-gateway
exchange-name="translatorExchange"
amqp-template="amqpTemplate"
routing-key-expression ="headers['translatorRoutingKey']"
mapped-request-headers="translator-*"
mapped-reply-headers="translator-*"/>
</int:chain>
所以,在转移到DSL之后,我有了这个:
return IntegrationFlows
.from("requestChannel")
.enrichHeaders(new Consumer<HeaderEnricherSpec>() {
@Override
public void accept(HeaderEnricherSpec t) {
t.header(Constants.MONITORING_ID, UUID.randomUUID());
}
})
.transform(customToJsonTransformer())
.handle(Amqp
.outboundGateway(rabbitTemplate())
.exchangeName(TRANSLATOR_EXCHANGE_NAME)
.routingKeyExpression(
"headers['" + Constants.TRANSLATOR_ROUTING_KEY + "']")
.mappedReplyHeaders(Constants.AMQP_CUSTOM_HEADER_FIELD_NAME_MATCH_PATTERN)
.mappedRequestHeaders(Constants.AMQP_CUSTOM_HEADER_FIELD_NAME_MATCH_PATTERN))
.route(new ResponseFromTranslatorRouterSI(jsonResponseMessageChannel(), exceptionResponseMessageChannel())).get();
嗯,问题是随机UUID作为monitoringId包含在头文件中,但在第一次执行后它保持不变,它不会像以前那样随每个请求而改变。
你知道我错过了什么吗?
感谢您的帮助。
答案 0 :(得分:5)
是的,这是正确的。
让我们再看看你的代码:
public void accept(HeaderEnricherSpec t) {
t.header(Constants.MONITORING_ID, UUID.randomUUID());
}
那么,当你的UUID.randomUUID()
被评估时?是的,就在accept()
方法调用期间。因此只有一次。
使用您的XML变体,您可以处理expression
,它真正评估每条消息。
要使它以Java DSL风格工作,你应该做类似的事情:
t.headerExpression(Constants.MONITORING_ID, "T(java.util.UUID).randomUUID()");
甚至更好:
t.headerFunction(Constants.MONITORING_ID,
new Function<Message<Object>, Object>() {
Object apply(Message<Object> message) {
return UUID.randomUUID();
}
}
);