【发布时间】:2018-06-19 07:52:55
【问题描述】:
我的项目使用 log4j,但这似乎被使用 java.util.logging 阻止了。 java信息: java版本“1.8.0_121” Java(TM) SE 运行时环境 (build 1.8.0_121-b13) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.121-b13,混合模式)
服务器是tomcat。
Jstack 日志如下:
"http-nio-192.168.0.94-8443-exec-316" #378 daemon prio=5 os_prio=0 tid=0x00007f96d4f42800 nid=0x3466 waiting for monitor entry [0x00007f96c753d000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.logging.SimpleFormatter.format(SimpleFormatter.java)
- waiting to lock <0x00000006c53cdae0> (a java.util.logging.SimpleFormatter)
at org.apache.juli.FileHandler.publish(FileHandler.java:197)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.log(Logger.java:788)
at org.restlet.engine.log.LogFilter.afterHandle(LogFilter.java:106)
at org.restlet.routing.Filter.handle(Filter.java:208)
at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
at org.restlet.Component.handle(Component.java:406)
at org.restlet.Server.handle(Server.java:516)
at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:72)
at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:152)
at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1118)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.xxx.xxx.web.Filter.xxxxxxx.doFilter(SGRequestCheck.java:129)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.xxx.trace.http.servlet.filter.BraveServletFilter.doFilter(BraveServletFilter.java:165)
at com.xxx.trace.http.servlet.filter.TraceServletFilter.doFilter(TraceServletFilter.java:73)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1756)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1715)
- locked <0x00000006c8a84a70> (a org.apache.tomcat.util.net.SecureNioChannel)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- <0x00000006c9f790b0> (a java.util.concurrent.ThreadPoolExecutor$Worker)
【问题讨论】:
-
是使用spring、tomcat和OAuth的应用吗?查找 OAuth 令牌可能是一个行为问题。 AP 的配置方式与 spring 上的框架不同,因此它们在寻找它时会相互锁定。它真的很奇怪和罕见。我曾经遇到过这个问题,但不记得确切的解决方案,但如果您几个月前使用与我一样的技术,描述应该是正确的。
-
一个
synchronized块。您可能可以在源代码中找到它。这不是 Log4j 代码 - 它是 JUL。 -
@LenglBoy 虽然你说的是真的,但堆栈跟踪表明一些非常不同的东西。您是如何从 JUL 格式转换为 JWT 的?
-
@LenglBoy 我不使用 spring 和 Oauth,这是一个 tomcat 应用程序。正如鲍里斯所说,这不是 Log4j 代码,而是 JUL 代码。但我无法将其更改为 Log4j,因为它在 Restlet jar 中。
-
好吧,你可以“改变它”,甚至通过 slf4j 或类似的方法。您可能需要使用提供的 jars 来处理,但 tomcat 允许这样的事情。请看这个答案:stackoverflow.com/questions/869945/…
标签: java multithreading blocked