Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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中使用reactor模式透明记录相关/请求id_Java_Logging_Log4j_Slf4j_Reactor - Fatal编程技术网

在Java中使用reactor模式透明记录相关/请求id

在Java中使用reactor模式透明记录相关/请求id,java,logging,log4j,slf4j,reactor,Java,Logging,Log4j,Slf4j,Reactor,问题由两部分组成 此id的正确名称是什么。我在internet上看到不同的名称:关联id、请求id、事务id。 我将举一个例子来更好地描述我所说的,而我希望这是非常常见和明显的情况 我希望操作的每个日志都带有唯一的id,以便能够使用此id对日志进行grep,并查看与操作相关的每个语句 class Controller { void process(Request request) { log.debug("{} Request accepted {}", id, request)

问题由两部分组成

  • 此id的正确名称是什么。我在internet上看到不同的名称:关联id、请求id、事务id。 我将举一个例子来更好地描述我所说的,而我希望这是非常常见和明显的情况
  • 我希望操作的每个日志都带有唯一的id,以便能够使用此id对日志进行grep,并查看与操作相关的每个语句

    class Controller {
      void process(Request request) {
        log.debug("{} Request accepted {}", id, request)
        Result result = service.process(request.data())
        log.debug("{} Request ended with {}", id, result)
      }
    }
    
    class Service {
      void process(Data data) {
        log.debug("{} Service started processing data {}", id, data);
        Result resultOne = repoOne.modify(data);
        log.debug("{} Repo one returned {}", id, resultOne);
        Result resultTwo = repoTwo.modify(data);
        log.debug("{} Repo two returned {}", id, resultTwo);
        return combinedResult(resultOne, resultTwo);
      }
    }
    
    并且日志在整个过程中应具有相同的唯一id

    ABCDE-ID Request accepted WITH DATA
    ABCDE-ID Service started processing DATA
    ABCDE-ID Repo one returned SUCCESS
    ABCDE-ID Repo two returned FAILURE
    ABCDE-ID Request ended with FAILURE
    
  • 如果应用程序使用的是reactor模式,如何在java代码中透明地注入这个id
  • 在每个请求的线程模型中,使用log4j框架中的MDC可以实现这一点。在rector模式中,不同的请求在等待io操作时由同一线程并发执行,所以线程局部变量没有帮助


    简单的解决方案是将id作为参数添加到每个方法中,但这在我看来很难看。我正在寻找另一种解决方案。

    如果您可以确保调用链将在同一
    线程中执行,则可以使用
    ThreadLocal
    存储您的关联
    id


    事实上,Log4J MDC(映射诊断上下文)功能允许您开箱即用。

    当使用反应式编程时,您不能确保事务的所有部分都在同一线程中执行,因此在这种情况下,基于ThreadLocal的方法无法工作。