Author: veithen
Date: Sat Sep 25 13:37:06 2010
New Revision: 1001210
URL: http://svn.apache.org/viewvc?rev=1001210&view=rev
Log:
Added a new module containing code to debug resource leaks caused by missing
calls to TransportSender#cleanup.
Added:
axis/axis2/java/transports/trunk/modules/debug/
axis/axis2/java/transports/trunk/modules/debug/pom.xml (with props)
axis/axis2/java/transports/trunk/modules/debug/src/
axis/axis2/java/transports/trunk/modules/debug/src/main/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/DebugTransportSender.java
(with props)
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/Invocation.java
(with props)
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/ReportScheduler.java
(with props)
axis/axis2/java/transports/trunk/src/site/apt/debug.apt
Modified:
axis/axis2/java/transports/trunk/pom.xml
axis/axis2/java/transports/trunk/src/site/site.xml
Added: axis/axis2/java/transports/trunk/modules/debug/pom.xml
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/modules/debug/pom.xml?rev=1001210&view=auto
==============================================================================
--- axis/axis2/java/transports/trunk/modules/debug/pom.xml (added)
+++ axis/axis2/java/transports/trunk/modules/debug/pom.xml Sat Sep 25 13:37:06
2010
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.axis2</groupId>
+ <artifactId>axis2-transports</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <groupId>org.apache.axis2</groupId>
+ <artifactId>axis2-transport-debug</artifactId>
+ <name>Apache Axis2 - Transport - Debugging tools</name>
+ <description>Contains a set of debugging tools for Axis2
transports</description>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.axis2</groupId>
+ <artifactId>axis2-kernel</artifactId>
+ <version>${axis2.version}</version>
+ </dependency>
+ </dependencies>
+</project>
Propchange: axis/axis2/java/transports/trunk/modules/debug/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added:
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/DebugTransportSender.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/DebugTransportSender.java?rev=1001210&view=auto
==============================================================================
---
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/DebugTransportSender.java
(added)
+++
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/DebugTransportSender.java
Sat Sep 25 13:37:06 2010
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.transport.debug;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.handlers.AbstractHandler;
+import org.apache.axis2.transport.TransportSender;
+import org.apache.axis2.util.Loader;
+
+public class DebugTransportSender extends AbstractHandler implements
TransportSender {
+ private static final String INVOCATION_KEY =
DebugTransportSender.class.getName() + ".INVOCATION";
+
+ private final Set<Invocation> invocations =
Collections.synchronizedSet(new HashSet<Invocation>());
+ private ReportScheduler scheduler;
+ private TransportSender target;
+
+ public void init(ConfigurationContext confContext, TransportOutDescription
transportOut) throws AxisFault {
+ Parameter targetClassParameter =
transportOut.getParameter("targetClass");
+ if (targetClassParameter == null) {
+ throw new AxisFault("targetClass parameter is mandatory");
+ }
+ try {
+ target =
(TransportSender)Loader.loadClass((String)targetClassParameter.getValue()).newInstance();
+ } catch (Exception ex) {
+ throw new AxisFault("Unable to create target TransportSender", ex);
+ }
+ scheduler = new ReportScheduler(this);
+ new Thread(scheduler).start();
+ target.init(confContext, transportOut);
+ }
+
+ public void cleanup(MessageContext msgContext) throws AxisFault {
+ Invocation invocation =
(Invocation)msgContext.getProperty(INVOCATION_KEY);
+ if (invocation == null) {
+ System.out.println("TransportSender#cleanup called without
corresponding call to TransportSender#invoke!");
+ } else if (!invocations.remove(invocation)) {
+ System.out.println("TransportSender#cleanup called twice for the
same message context.");
+ }
+ scheduler.scheduleReport();
+ target.cleanup(msgContext);
+ }
+
+ public InvocationResponse invoke(MessageContext msgContext) throws
AxisFault {
+ Invocation invocation = new
Invocation(Thread.currentThread().getStackTrace());
+ invocations.add(invocation);
+ msgContext.setProperty(INVOCATION_KEY, invocation);
+ scheduler.scheduleReport();
+ return target.invoke(msgContext);
+ }
+
+ public void stop() {
+ target.stop();
+ scheduler.stop();
+ generateReport();
+ }
+
+ void generateReport() {
+ synchronized (invocations) {
+ int size = invocations.size();
+ if (size > 0) {
+ System.out.println("There is/are " + size
+ + " pending invocation(s) for which
TransportSender#cleanup has not been called yet:");
+ for (Invocation invocation : invocations) {
+ System.out.println();
+ for (StackTraceElement ste : invocation.getStackTrace()) {
+ System.out.println(ste);
+ }
+ }
+ }
+ }
+ }
+}
Propchange:
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/DebugTransportSender.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/Invocation.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/Invocation.java?rev=1001210&view=auto
==============================================================================
---
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/Invocation.java
(added)
+++
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/Invocation.java
Sat Sep 25 13:37:06 2010
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.transport.debug;
+
+class Invocation {
+ private final StackTraceElement[] stackTrace;
+
+ public Invocation(StackTraceElement[] stackTrace) {
+ this.stackTrace = stackTrace;
+ }
+
+ public StackTraceElement[] getStackTrace() {
+ return stackTrace;
+ }
+}
Propchange:
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/Invocation.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/ReportScheduler.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/ReportScheduler.java?rev=1001210&view=auto
==============================================================================
---
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/ReportScheduler.java
(added)
+++
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/ReportScheduler.java
Sat Sep 25 13:37:06 2010
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.transport.debug;
+
+class ReportScheduler implements Runnable {
+ private final DebugTransportSender sender;
+ private long nextReport = -1;
+ private boolean running;
+
+ public ReportScheduler(DebugTransportSender sender) {
+ this.sender = sender;
+ }
+
+ public synchronized void run() {
+ while (running) {
+ try {
+ if (nextReport == -1) {
+ wait();
+ } else {
+ long timeout = nextReport - System.currentTimeMillis();
+ if (timeout > 0) {
+ wait(timeout);
+ } else {
+ sender.generateReport();
+ }
+ }
+ } catch (InterruptedException ex) {
+ break;
+ }
+ }
+ }
+
+ public synchronized void scheduleReport() {
+ nextReport = System.currentTimeMillis() + 10000;
+ notifyAll();
+ }
+
+ public synchronized void stop() {
+ running = false;
+ notifyAll();
+ }
+}
Propchange:
axis/axis2/java/transports/trunk/modules/debug/src/main/java/org/apache/axis2/transport/debug/ReportScheduler.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: axis/axis2/java/transports/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/pom.xml?rev=1001210&r1=1001209&r2=1001210&view=diff
==============================================================================
--- axis/axis2/java/transports/trunk/pom.xml (original)
+++ axis/axis2/java/transports/trunk/pom.xml Sat Sep 25 13:37:06 2010
@@ -160,6 +160,7 @@
<module>modules/jms</module>
<module>modules/sms</module>
<module>modules/testkit</module>
+ <module>modules/debug</module>
<module>modules/all</module>
</modules>
Added: axis/axis2/java/transports/trunk/src/site/apt/debug.apt
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/src/site/apt/debug.apt?rev=1001210&view=auto
==============================================================================
--- axis/axis2/java/transports/trunk/src/site/apt/debug.apt (added)
+++ axis/axis2/java/transports/trunk/src/site/apt/debug.apt Sat Sep 25 13:37:06
2010
@@ -0,0 +1,53 @@
+~~ Licensed to the Apache Software Foundation (ASF) under one
+~~ or more contributor license agreements. See the NOTICE file
+~~ distributed with this work for additional information
+~~ regarding copyright ownership. The ASF licenses this file
+~~ to you under the Apache License, Version 2.0 (the
+~~ "License"); you may not use this file except in compliance
+~~ with the License. You may obtain a copy of the License at
+~~
+~~ http://www.apache.org/licenses/LICENSE-2.0
+~~
+~~ Unless required by applicable law or agreed to in writing,
+~~ software distributed under the License is distributed on an
+~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+~~ KIND, either express or implied. See the License for the
+~~ specific language governing permissions and limitations
+~~ under the License.
+
+Transport debugging tools
+
+ The <<<axis2-transport-debug>>> module contains tools to debug transport
related problems.
+
+* Locating missing calls to <<<TransportSender#cleanup(MessageContext)>>>
+
+ The Axis2 transport API requires that
<<<TransportSender#cleanup(MessageContext)>>> be called for
+ for every call to <<<TransportSender#invoke(MessageContext)>>>. This is
necessary to allow the transport
+ sender to clean up resources after the response message has been processed.
When using the <<<ServiceClient>>>
+ API, this is done explicitly by a call to
<<<ServiceClient#cleanupTransport()>>> or implicitly
+ when sending another request.
+
+ Failure to call <<<TransportSender#cleanup(MessageContext)>>> will cause
resource leaks.
+ However, this type of problem is difficult to debug because the error that
is triggered by
+ the resource leak usually can't be correlated directly with the
<<<TransportSender#invoke(MessageContext)>>>
+ invocation(s) for which the cleanup has not been done.
+
+ In these situations, <<<DebugTransportSender>>> comes to the rescue. It acts
as a wrapper
+ around an existing <<<TransportSender>>> implementation and keeps track of
the calls to
+ <<<TransportSender#invoke(MessageContext)>>> and
<<<TransportSender#cleanup(MessageContext)>>>.
+ If it detects that <<<TransportSender#cleanup(MessageContext)>>> has not
been called after a
+ given timeout, it will output a report containing the stack trace of the
invocation of
+ <<<TransportSender#invoke(MessageContext)>>>.
+
+ In order to enable this feature for a given transport, simply replace the
configured
+ class by <<<org.apache.axis2.transport.debug.DebugTransportSender>>> and add
a
+ <<<targetClass>>> parameter with the real (original) transport sender
implementation.
+ Here is an example for the HTTP transport:
+
++------------------------+
+<transportSender name="http"
class="org.apache.axis2.transport.debug.DebugTransportSender">
+ <parameter
name="targetClass">org.apache.axis2.transport.http.CommonsHTTPTransportSender</parameter>
+ <parameter name="PROTOCOL">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding">chunked</parameter>
+</transportSender>
++------------------------+
Modified: axis/axis2/java/transports/trunk/src/site/site.xml
URL:
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/src/site/site.xml?rev=1001210&r1=1001209&r2=1001210&view=diff
==============================================================================
--- axis/axis2/java/transports/trunk/src/site/site.xml (original)
+++ axis/axis2/java/transports/trunk/src/site/site.xml Sat Sep 25 13:37:06 2010
@@ -59,6 +59,7 @@
<item name="UDP" href="udp.html"/>
<item name="XMPP" href="xmpp.html"/>
<item name="SMS" href="sms.html"/>
+ <item name="Debug" href="debug.html"/>
</item>
<item name="Project Information" href="project-info.html">
<item name="Mailing Lists" href="mail-lists.html"/>