Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有随机UUID的Spring集成enrichHeader_Java_Spring_Spring Integration - Fatal编程技术网

Java 带有随机UUID的Spring集成enrichHeader

Java 带有随机UUID的Spring集成enrichHeader,java,spring,spring-integration,Java,Spring,Spring Integration,我是一个使用Java7的Spring集成新手,在转向Spring集成DSL之前,我有这个xml配置,我的应用程序正在使用从随机UUID生成的监视ID来丰富头部(这是为了将请求和响应关联起来,以便以后在日志中搜索,也许可以用另一种方式完成,我不知道): 因此,在转向DSL之后,我有以下几点: return IntegrationFlows .from("requestChannel") .enrichHeaders(new Consumer<HeaderEnricherS

我是一个使用Java7的Spring集成新手,在转向Spring集成DSL之前,我有这个xml配置,我的应用程序正在使用从随机UUID生成的监视ID来丰富头部(这是为了将请求和响应关联起来,以便以后在日志中搜索,也许可以用另一种方式完成,我不知道):


因此,在转向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();
返回集成流
.来自(“请求频道”)
.enrichHeaders(新消费者(){
@凌驾
公共无效接受(HeaderEnricherSpec t){
t、 标题(Constants.MONITORING_ID,UUID.randomuid());
}
}) 
.transform(customToJsonTransformer())
.手柄(Amqp
.outboundGateway(rabbitTemplate())
.exchangeName(翻译程序交换名称)
.路由键表达式(
“标题['”+Constants.TRANSLATOR_ROUTING_KEY+“]”)
.mappedReplyHeaders(常量.AMQP\u自定义\u标题\u字段\u名称\u匹配\u模式)
.mappedRequestHeaders(常数.AMQP\自定义\标题\字段\名称\匹配\模式))
.route(新的ResponseFromTranslator路由(jsonResponseMessageChannel(),exceptionResponseMessageChannel()).get();
好的,问题是随机UUID作为monitoringId包含在头文件中,但是在第一次执行之后它保持不变,它不会像以前那样随每个请求而改变

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

谢谢你的帮助。

是的,没错

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

public void accept(HeaderEnricherSpec t) {
      t.header(Constants.MONITORING_ID, UUID.randomUUID());
}
那么,当您的
UUID.randomUUID()
将被评估时?对,就在
accept()
方法调用期间。因此,只有一次

使用XML变量,您可以处理真正对每条消息求值的
表达式

要使其以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();
           }
     }
);
t.headerFunction(常数.MONITORING\u ID,
新函数(){
对象应用(消息){
返回UUID.randomUUID();
}
}
);
t.headerFunction(Constants.MONITORING_ID, 
     new Function<Message<Object>, Object>() {
           Object apply(Message<Object> message) {
               return UUID.randomUUID();
           }
     }
);