WildFly 8.2.X在重新部署后挂起并且没有响应

时间:2015-07-31 16:24:26

标签: deadlock wildfly

我们将应用程序从JBoss AS 7.1.1移动到WildFly 8.2.X(8.2.0-Final和8.2.1-Final)并发现以下问题:

  1. 首次部署工作正常(比JBoss AS 7.1.1慢,但在我看来这是另一个问题)。
  2. 在我们重新部署相同的EAR文件(来自Eclipse或Web Interface)之后,只要它们不是并发/顺序的,就会处理JAX-RS请求。当两个并行的JAX-RS请求到来时,任何Jax-RS请求(包括前两个并行)都将超时。无论哪个REST资源都将分派HTTP请求。
  3. 我调试了RestEasy 3.0.10库,发现代码只是等待the dispatched REST method to return。另一方面,一旦被绞死,它永远不会进入我的REST方法(我的Rest资源)。

    有关如何进一步调试的任何想法?我无法在完全相同的服务器上与其他EAR应用程序重现此行为。

1 个答案:

答案 0 :(得分:0)

在进一步检查jconsole之后,我看到创建了一个死锁:一个线程在等待

org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231) org.apache.log4j.JBossAppenderHandler.doPublish(JBossAppenderHandler.java:42) org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:79) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:296) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.Logger.logRaw(Logger.java:721) org.jboss.logmanager.Logger.log(Logger.java:506) org.jboss.stdio.AbstractLoggingWriter.write(AbstractLoggingWriter.java:71) - locked java.lang.StringBuilder@497a942 org.jboss.stdio.WriterOutputStream.finish(WriterOutputStream.java:143) org.jboss.stdio.WriterOutputStream.flush(WriterOutputStream.java:164) - locked sun.nio.cs.UTF_8$Decoder@e92e69 java.io.PrintStream.write(PrintStream.java:482) - locked java.io.PrintStream@d4482dd

和另一个等待

java.io.PrintStream.flush(PrintStream.java:335) org.jboss.stdio.StdioContext$DelegatingPrintStream.flush(StdioContext.java:216) sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:297) sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) - locked java.io.OutputStreamWriter@7797a41d java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:59) org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:324) org.apache.log4j.WriterAppender.append(WriterAppender.java:162)

问题似乎是EAR应用程序带有自己的log4j库,而不排除WildFly中的那个。 jboss-deployment-structure.xml文件中的以下部分似乎通过disabling the loading of the logging subsystem

来解决问题
<jboss-deployment-structure>
  <deployment>
     <!-- exclude-subsystem prevents a subsystems deployment unit processors running on a deployment -->
     <!-- which gives basically the same effect as removing the subsystem, but it only affects single deployment -->
     <exclude-subsystems>
        <subsystem name="logging" />
    </exclude-subsystems>
  </deployment>
</jboss-deployment-structure>