Spring 与 randomUUID 集成 enrichHeader

Spring Integration enrichHeader with randomUUID

我是 Spring 集成的新手,使用 Java 7,在转向 Spring 集成 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 作为 monitoringId 包含在 headers 中,但在第一次执行后它保持不变,它不会像以前那样随着每个请求而改变。

你知道我是否遗漏了什么吗?

感谢您的帮助。

是的,没错。

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

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