我是使用Java 7的Spring Integration的新手,在迁移到Spring Integration DSL之前,我已经进行了xml配置,并且我的应用程序正在尝试使用通过随机UUID生成的监视ID来填充 header (这是为了将请求和响应,以便以后在日志中进行搜索,也许可以通过其他方式完成此操作(不知道):

<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作为监视ID包含在 header 中,但是在第一次执行后,它保持不变,它不会像以前那样随每个请求而变化。

你知道我是否想念什么吗?

谢谢你的帮助。

最佳答案

对,那是正确的。

让我们再看一遍您的代码:

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();
           }
     }
);

10-07 12:17
查看更多