简体   繁体   English

Spring Integration使用randomUUID来richHeader

[英]Spring Integration enrichHeader with randomUUID

I'm a newbie with Spring Integration, using Java 7, and I had this xml configuration before moving to Spring integration DSL, and my application was working to enrich a header with a monitoring ID generated from random UUID (This was to correlate request and response for later searching in logs, maybe this could be done in a different way, don't know): 我是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>

So, after moving to DSL, I have this: 所以,在转移到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();

Well, the thing is that random UUID is included in headers as monitoringId, but after the first execution it remains the same, it does not change with each request as was before. 好吧,事实是随机UUID作为monitoringId包含在头文件中,但在第一次执行后它保持不变,它不会像以前那样随每个请求而改变。

Do you know if I am missing something? 你知道我错过了什么吗?

Thanks for your help. 谢谢你的帮助。

Yes, that's correct. 对,那是正确的。

Let's take a look to your code one more time: 让我们再看看你的代码:

public void accept(HeaderEnricherSpec t) {
      t.header(Constants.MONITORING_ID, UUID.randomUUID());
}

So, when your UUID.randomUUID() will be evaluated? 那么,当你的UUID.randomUUID()被评估时? Right, just during accept() method invocation. 对,就在accept()方法调用期间。 Therefore only once. 因此只有一次。

With your XML variant you deal with expression which really evaluates for each message. 使用XML变体,您将处理expression ,该expression真正评估每条消息。

To make it working in Java DSL style you should do something similar: 为了使它以Java DSL风格工作,你应该做类似的事情:

 t.headerExpression(Constants.MONITORING_ID, "T(java.util.UUID).randomUUID()");

or even better like: 或者甚至更好:

t.headerFunction(Constants.MONITORING_ID, 
     new Function<Message<Object>, Object>() {
           Object apply(Message<Object> message) {
               return UUID.randomUUID();
           }
     }
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM