diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java b/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java index ee7035ddef358226f75bab5bbee99a4519d4c34d..757c6e3b66a3baa6427ecdbeb9ea30ebe0be4093 100644 --- a/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java +++ b/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java @@ -17,11 +17,14 @@ package ch.systemsx.cisd.common.utilities; import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.Thread.State; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; +import org.apache.log4j.Logger; + /** * Helper class which dumps all threads onto the console or a {@link PrintWriter}. * @@ -39,6 +42,22 @@ public class ThreadDump writer.flush(); } + /** + * Dumps all threads onto the specified logger as an INFO message. + */ + public static void dumpAllThreads(Logger logger) + { + if (logger.isInfoEnabled() == false) + { + return; + } + StringWriter stringWriter = new StringWriter(); + PrintWriter writer = new PrintWriter(stringWriter); + dumpAllThreads(writer); + writer.flush(); + logger.info("Thread dump:\n" + stringWriter.toString()); + } + /** * Dumps all threads onto the specified writer. */ @@ -50,8 +69,8 @@ public class ThreadDump { Thread thread = entry.getKey(); State state = thread.getState(); - writer.println(thread + " state: " + State.valueOf(state.name()) + " daemon: " - + thread.isDaemon() + " alive: " + thread.isAlive() + " interrupted: " + writer.println(thread + ", state:" + State.valueOf(state.name()) + ", daemon:" + + thread.isDaemon() + ", alive:" + thread.isAlive() + ", interrupted:" + thread.isInterrupted()); StackTraceElement[] stackTraceElements = entry.getValue(); for (StackTraceElement stackTraceElement : stackTraceElements) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java index b6a4a613257e8e2bd6f8ac001a509c4d3575d06d..8b72c9642a350d2a4d66347b6bbea9b9ee28bd7e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; +import org.apache.log4j.Logger; import org.springframework.aop.ClassFilter; import org.springframework.aop.MethodMatcher; import org.springframework.aop.Pointcut; @@ -29,6 +30,8 @@ import org.springframework.transaction.TransactionSystemException; import org.springframework.transaction.annotation.Transactional; import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.common.logging.LogCategory; +import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.utilities.ThreadDump; import ch.systemsx.cisd.openbis.generic.shared.IServer; @@ -50,6 +53,9 @@ public class ServerExceptionTranslatingAdvisor extends DefaultPointcutAdvisor private static final long serialVersionUID = 1L; + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, + ServerExceptionTranslatingAdvisor.class); + public ServerExceptionTranslatingAdvisor() { super(new AllServerMethodsPointcut(), new UserFailureExceptionTranslatingInterceptor()); @@ -98,7 +104,7 @@ public class ServerExceptionTranslatingAdvisor extends DefaultPointcutAdvisor if (message.contains("deadlock detected") || message.contains("Row was updated or deleted by another transaction")) { - ThreadDump.dumpAllThreads(); + ThreadDump.dumpAllThreads(operationLog); } }