这篇文章主要介绍在web应用程序中如何传MDC的值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、雅安服务器托管、营销软件、网站建设、巴州网站维护、网站推广。
传MDC的值
MDC(Mapped Diagnostic Context)通常用于存储单个任务的特定值。例如,在web应用程序中,它可能为每个请求存储一个请求id和一个用户id,因此MDC查找与单个请求或整个用户活动相关的日志记录变得更加容易。
2017-08-27 14:38:30,893 INFO [server-thread-0] [requestId=060d8c7f, userId=2928ea66] c.g.s.web.Controller - Message.
可是如果代码的某些部分是在专用线程池中执行的,则线程(提交任务的线程)中MDC就不会被继续传值。在下面的示例中,第7行的日志中包含“requestId”,而第9行的日志则没有:
@GET @Path("/genre/{name}") @Produces(MediaType.APPLICATION_JSON) public void getGenre(@PathParam("name") String genreName, @Suspended AsyncResponse response) { try (MDC.MDCCloseable ignored = MDC.putCloseable("requestId", UUID.randomUUID().toString())) { String genreId = getGenreIdbyName(genreName); //Sync call logger.trace("Submitting task to find genre with id '{}'.", genreId); //'requestId' is logged executorService.submit(() -> { logger.trace("Starting task to find genre with id '{}'.", genreId); //'requestId' is not logged Response result = getGenre(genreId) //Async call .map(artist -> Response.ok(artist).build()) .orElseGet(() -> Response.status(Response.Status.NOT_FOUND).build()); response.resume(result); } ); } }
这可以通过MDC#getCopyOfContextMap()方法来解决:
... public void getGenre(@PathParam("name") String genreName, @Suspended AsyncResponse response) { try (MDC.MDCCloseable ignored = MDC.putCloseable("requestId", UUID.randomUUID().toString())) { ... logger.trace("Submitting task to find genre with id '{}'.", genreId); //'requestId' is logged withCopyingMdc(executorService, () -> { logger.trace("Starting task to find genre with id '{}'.", genreId); //'requestId' is logged ... }); } } private void withCopyingMdc(ExecutorService executorService, Runnable function) { Map
以上是“在web应用程序中如何传MDC的值”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!
文章名称:在web应用程序中如何传MDC的值
URL地址:https://www.cdcxhl.com/article10/peosdo.html
成都网站建设公司_创新互联,为您提供手机网站建设、用户体验、全网营销推广、电子商务、网站设计公司、网站内链
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联