【问题标题】:Spring Integration enrichHeader with randomUUID具有 randomUUID 的 Spring 集成丰富Header
【发布时间】:2016-01-22 09:29:19
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

    标签: java spring spring-integration


    【解决方案1】:

    是的,没错。

    让我们再看看你的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2011-02-11
      • 2011-06-24
      相关资源
      最近更新 更多