Java Logback FilterReply上的ClassCircularityError
我们遇到了Java类加载机制的一些非常奇怪的行为。在实现Logback的Java Logback FilterReply上的ClassCircularityError,java,jetty,classloader,Java,Jetty,Classloader,我们遇到了Java类加载机制的一些非常奇怪的行为。在实现Logback的TurboFilter时,我得到了ClassCircularityError。我有以下简单的实现: public class ActivatingTurboFilter extends TurboFilter { [...] @Override public FilterReply decide(Marker marker, Logger logger,
TurboFilter
时,我得到了ClassCircularityError
。我有以下简单的实现:
public class ActivatingTurboFilter extends TurboFilter {
[...]
@Override
public FilterReply decide(Marker marker, Logger logger,
Level level, String format, Object[] params,
Throwable t) {
if (!expectedValue.equals(MDC.get(key)))
return NEUTRAL;
return isLevelAndLoggerValid(level, logger.getName()) ? ACCEPT : NEUTRAL;
}
}
应用程序作为WAR文件部署在Jetty/9.2.10上。调用decise()
方法时,我得到:
java.lang.ClassCircularityError: ch/qos/logback/core/spi/FilterReply
at me.bazhenov.whisperer.ActivatingTurboFilter.decide(ActivatingTurboFilter.java:33)
at ch.qos.logback.classic.spi.TurboFilterList.getTurboFilterChainDecision(TurboFilterList.java:62)
at ch.qos.logback.classic.LoggerContext.getTurboFilterChainDecision_0_3OrMore(LoggerContext.java:252)
at ch.qos.logback.classic.Logger.callTurboFilters(Logger.java:772)
at ch.qos.logback.classic.Logger.isTraceEnabled(Logger.java:644)
at ch.qos.logback.classic.Logger.isTraceEnabled(Logger.java:640)
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.isTraceEnabled(SLF4JLocationAwareLog.java:60)
at org.apache.activemq.transport.failover.FailoverTransport.handleTransportFailure(FailoverTransport.java:208)
at org.apache.activemq.transport.failover.FailoverTransport$3.onException(FailoverTransport.java:186)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:160)
at org.apache.activemq.transport.InactivityMonitor.onException(InactivityMonitor.java:255)
at org.apache.activemq.transport.TransportSupport.onException(TransportSupport.java:96)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:205)
at java.lang.Thread.run(Thread.java:745)
一些补充资料:
- 异常在
上抛出,这是ActivatingTurboFilter.java:33
李>FilterReply所在的行。返回空档
- 在方法调用时,已加载enum
。使用FilterReply
日志记录和-verbose:class
中的实例计数进行确认李>jmap-histo
- 后勤保障(1.1.2版)不是应用程序的一部分,而是码头安装的一部分。所以它位于Jetty home dir的
目录中lib
- 只有一个Logback实例提供给应用程序(因此,
只有一个定义可用)。使用FilterReply
日志记录以及-verbose:class
(在Jetty home目录和WAR文件内容中)查找确认-name\*.jar | xargs-n1 zipinfo | grep-i FilterReply
qtp
threads),所有这些都可以正常工作
我想不出去哪里找原因了。你有没有想过?