Author: asankha
Date: Tue Oct  7 10:33:42 2008
New Revision: 702553

URL: http://svn.apache.org/viewvc?rev=702553&view=rev
Log:
Fix SYNAPSE-459 - Runtime Exceptions cause thread pools to discard threads
Improve transport JMX management to include timeouts, message size metrics, and 
error codes and frequency. Also allow the reset of metrics and query 
information about the metrics window


Added:
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MessageLevelMetricsCollector.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeThreadFactory.java
Modified:
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportListener.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportSender.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/ManagementSupport.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MetricsCollector.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportView.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportViewMBean.java
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeWorkerPool.java

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportListener.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportListener.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportListener.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportListener.java
 Tue Oct  7 10:33:42 2008
@@ -439,6 +439,89 @@
         return -1;
     }
 
+    public long getTimeoutsReceiving() {
+        if (metrics != null) {
+            return metrics.getTimeoutsReceiving();
+        }
+        return -1;
+    }
+
+    public long getTimeoutsSending() {
+        if (metrics != null) {
+            return metrics.getTimeoutsSending();
+        }
+        return -1;
+    }
+
+    public long getMinSizeReceived() {
+        if (metrics != null) {
+            return metrics.getMinSizeReceived();
+        }
+        return -1;
+    }
+
+    public long getMaxSizeReceived() {
+        if (metrics != null) {
+            return metrics.getMaxSizeReceived();
+        }
+        return -1;
+    }
+
+    public double getAvgSizeReceived() {
+        if (metrics != null) {
+            return metrics.getAvgSizeReceived();
+        }
+        return -1;
+    }
+
+    public long getMinSizeSent() {
+        if (metrics != null) {
+            return metrics.getMinSizeSent();
+        }
+        return -1;
+    }
+
+    public long getMaxSizeSent() {
+        if (metrics != null) {
+            return metrics.getMaxSizeSent();
+        }
+        return -1;
+    }
+
+    public double getAvgSizeSent() {
+        if (metrics != null) {
+            return metrics.getAvgSizeSent();
+        }
+        return -1;
+    }
+
+    public Map getResponseCodeTable() {
+        if (metrics != null) {
+            return metrics.getResponseCodeTable();
+        }
+        return null;
+    }
+
+    public void resetStatistics() {
+        if (metrics != null) {
+            metrics.reset();
+        }
+    }
+
+    public long getLastResetTime() {
+        if (metrics != null) {
+            return metrics.getLastResetTime();
+        }
+        return -1;
+    }
+
+    public long getMetricsWindow() {
+        if (metrics != null) {
+            return System.currentTimeMillis() - metrics.getLastResetTime();
+        }
+        return -1;
+    }    
+
     private String getEndpointMBeanName(String serviceName) {
         return mbeanSupport.getMBeanName() + ",Group=Services,Service=" + 
serviceName;
     }

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportSender.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportSender.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportSender.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/AbstractTransportSender.java
 Tue Oct  7 10:33:42 2008
@@ -307,6 +307,89 @@
         return -1;
     }
 
+    public long getTimeoutsReceiving() {
+        if (metrics != null) {
+            return metrics.getTimeoutsReceiving();
+        }
+        return -1;
+    }
+
+    public long getTimeoutsSending() {
+        if (metrics != null) {
+            return metrics.getTimeoutsSending();
+        }
+        return -1;
+    }
+
+    public long getMinSizeReceived() {
+        if (metrics != null) {
+            return metrics.getMinSizeReceived();
+        }
+        return -1;
+    }
+
+    public long getMaxSizeReceived() {
+        if (metrics != null) {
+            return metrics.getMaxSizeReceived();
+        }
+        return -1;
+    }
+
+    public double getAvgSizeReceived() {
+        if (metrics != null) {
+            return metrics.getAvgSizeReceived();
+        }
+        return -1;
+    }
+
+    public long getMinSizeSent() {
+        if (metrics != null) {
+            return metrics.getMinSizeSent();
+        }
+        return -1;
+    }
+
+    public long getMaxSizeSent() {
+        if (metrics != null) {
+            return metrics.getMaxSizeSent();
+        }
+        return -1;
+    }
+
+    public double getAvgSizeSent() {
+        if (metrics != null) {
+            return metrics.getAvgSizeSent();
+        }
+        return -1;
+    }
+
+    public Map getResponseCodeTable() {
+        if (metrics != null) {
+            return metrics.getResponseCodeTable();
+        }
+        return null;
+    }
+
+    public void resetStatistics() {
+        if (metrics != null) {
+            metrics.reset();
+        }
+    }
+
+    public long getLastResetTime() {
+        if (metrics != null) {
+            return metrics.getLastResetTime();
+        }
+        return -1;
+    }
+
+    public long getMetricsWindow() {
+        if (metrics != null) {
+            return System.currentTimeMillis() - metrics.getLastResetTime();
+        }
+        return -1;
+    } 
+
     private void registerMBean(MBeanServer mbs, Object mbeanInstance, String 
objectName) {
         try {
             ObjectName name = new ObjectName(objectName);

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
 Tue Oct  7 10:33:42 2008
@@ -44,6 +44,10 @@
      * character set marker to identify charset from a Content-Type string
      */
     public static final String CHARSET_PARAM = "; charset=";
+    /**
+     * The property specifying an optional message level metrics collector
+     */
+    public static final String METRICS_COLLECTOR = "METRICS_COLLECTOR";    
 
     //------------------------------------ defaults 
------------------------------------
     /**

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/ManagementSupport.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/ManagementSupport.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/ManagementSupport.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/ManagementSupport.java
 Tue Oct  7 10:33:42 2008
@@ -1,6 +1,7 @@
 package org.apache.axis2.transport.base;
 
 import org.apache.axis2.AxisFault;
+import java.util.Map;
 
 /*
 *  Licensed to the Apache Software Foundation (ASF) under one
@@ -29,8 +30,21 @@
 
     public long getMessagesReceived();
     public long getFaultsReceiving();
+    public long getTimeoutsReceiving();
     public long getMessagesSent();
     public long getFaultsSending();
+    public long getTimeoutsSending();
     public long getBytesReceived();
     public long getBytesSent();
+    public long getMinSizeReceived();
+    public long getMaxSizeReceived();
+    public double getAvgSizeReceived();
+    public long getMinSizeSent();
+    public long getMaxSizeSent();
+    public double getAvgSizeSent();
+    public Map getResponseCodeTable();
+
+    public void resetStatistics();
+    public long getLastResetTime();
+    public long getMetricsWindow();
 }

Added: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MessageLevelMetricsCollector.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MessageLevelMetricsCollector.java?rev=702553&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MessageLevelMetricsCollector.java
 (added)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MessageLevelMetricsCollector.java
 Tue Oct  7 10:33:42 2008
@@ -0,0 +1,49 @@
+/*
+ *  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.base;
+
+public interface MessageLevelMetricsCollector {
+
+    public void incrementMessagesReceived();
+
+    public void incrementFaultsReceiving(int errorCode);
+
+    public void incrementTimeoutsReceiving();
+
+    public void incrementBytesReceived(long size);
+
+    public void incrementMessagesSent();
+
+    public void incrementFaultsSending(int errorCode);
+
+    public void incrementTimeoutsSending();
+
+    public void incrementBytesSent(long size);
+
+    public void notifyReceivedMessageSize(long size);
+
+    public void notifySentMessageSize(long size);
+
+    public void reportReceivingFault(int errorCode);
+
+    public void reportSendingFault(int errorCode);
+
+    public void reportResponseCode(int respCode);
+}

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MetricsCollector.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MetricsCollector.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MetricsCollector.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/MetricsCollector.java
 Tue Oct  7 10:33:42 2008
@@ -18,31 +18,77 @@
  */
 
 package org.apache.axis2.transport.base;
+import org.apache.axis2.context.MessageContext;
+
+import java.util.Map;
+import java.util.Collections;
+import java.util.HashMap;
 
 /**
  * Collects metrics related to a transport that has metrics support enabled
  */
 public class MetricsCollector {
 
+    public static final int LEVEL_NONE = 0;
+    public static final int LEVEL_TRANSPORT = 1;
+    public static final int LEVEL_FULL = 2;
+    private static final Long ONE = (long) 1;
+
+    /** By default, full metrics collection is enabled */
+    private int level = LEVEL_FULL;
+
     private long messagesReceived;
     private long faultsReceiving;
     private long timeoutsReceiving;
     private long bytesReceived;
+    private long minSizeReceived;
+    private long maxSizeReceived;
+    private double avgSizeReceived;
 
     private long messagesSent;
     private long faultsSending;
     private long timeoutsSending;
     private long bytesSent;
+    private long minSizeSent;
+    private long maxSizeSent;
+    private double avgSizeSent;
+
+    private final Map<Integer, Long> responseCodeTable =
+        Collections.synchronizedMap(new HashMap<Integer, Long>());
+
+    private long lastResetTime = System.currentTimeMillis();
 
     public void reset() {
-        messagesReceived = 0;
-        faultsReceiving = 0;
+        messagesReceived  = 0;
+        faultsReceiving   = 0;
         timeoutsReceiving = 0;
-        bytesReceived = 0;
-        messagesSent = 0;
-        faultsSending = 0;
-        timeoutsSending = 0;
-        bytesSent = 0;
+        bytesReceived     = 0;
+        minSizeReceived   = 0;
+        maxSizeReceived   = 0;
+        avgSizeReceived   = 0;
+
+        messagesSent      = 0;
+        faultsSending     = 0;
+        timeoutsSending   = 0;
+        bytesSent         = 0;
+        minSizeSent       = 0;
+        maxSizeSent       = 0;
+        avgSizeSent       = 0;
+
+        responseCodeTable.clear();
+        lastResetTime = System.currentTimeMillis();
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public long getLastResetTime() {
+        return lastResetTime;
     }
 
     public long getMessagesReceived() {
@@ -77,6 +123,34 @@
         return bytesSent;
     }
 
+    public long getMinSizeReceived() {
+        return minSizeReceived;
+    }
+
+    public long getMaxSizeReceived() {
+        return maxSizeReceived;
+    }
+
+    public long getMinSizeSent() {
+        return minSizeSent;
+    }
+
+    public long getMaxSizeSent() {
+        return maxSizeSent;
+    }
+
+    public double getAvgSizeReceived() {
+        return avgSizeReceived;
+    }
+
+    public double getAvgSizeSent() {
+        return avgSizeSent;
+    }
+
+    public Map<Integer, Long> getResponseCodeTable() {
+        return responseCodeTable;
+    }
+
     public synchronized void incrementMessagesReceived() {
         messagesReceived++;
     }
@@ -108,4 +182,134 @@
     public synchronized void incrementBytesSent(long size) {
         bytesSent += size;
     }
+    
+    public synchronized void notifyReceivedMessageSize(long size) {
+        if (minSizeReceived == 0 || size < minSizeReceived) {
+            minSizeReceived = size;
+        }
+        if (size > maxSizeReceived) {
+            maxSizeReceived = size;
+        }
+        avgSizeReceived = (avgSizeReceived == 0 ? size : (avgSizeReceived + 
size) / 2);
+    }
+
+    public synchronized void notifySentMessageSize(long size) {
+        if (minSizeSent == 0 || size < minSizeSent) {
+            minSizeSent = size;
+        }
+        if (size > maxSizeSent) {
+            maxSizeSent = size;
+        }
+        avgSizeSent = (avgSizeSent == 0 ? size : (avgSizeSent + size) / 2);
+    }
+
+    public void reportResponseCode(int respCode) {
+        synchronized(responseCodeTable) {
+            Object o = responseCodeTable.get(respCode);
+            if (o == null) {
+                responseCodeTable.put(respCode, ONE);
+            } else {
+                responseCodeTable.put(respCode, (Long) o + 1);
+            }
+        }
+    }
+
+    // --- enhanced methods ---
+    private MessageLevelMetricsCollector getMsgLevelMetrics(MessageContext mc) 
{
+        if (mc != null && level == LEVEL_FULL) {
+            return (MessageLevelMetricsCollector) 
mc.getProperty(BaseConstants.METRICS_COLLECTOR);
+        }
+        return null;
+    }
+
+    public void incrementMessagesReceived(MessageContext mc) {
+        incrementMessagesReceived();
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementMessagesReceived();
+        }
+    }
+
+    public void incrementFaultsReceiving(int errorCode, MessageContext mc) {
+        incrementFaultsReceiving();
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementFaultsReceiving(errorCode);
+        }
+    }
+
+    public void incrementTimeoutsReceiving(MessageContext mc) {
+        incrementTimeoutsReceiving();
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementTimeoutsReceiving();
+        }
+    }
+
+    public void incrementBytesReceived(MessageContext mc, long size) {
+        incrementBytesReceived(size);
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementBytesReceived(size);
+        }
+    }
+
+    public void incrementMessagesSent(MessageContext mc) {
+        incrementMessagesSent();
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementMessagesSent();
+        }
+    }
+
+    public void incrementFaultsSending(int errorCode, MessageContext mc) {
+        incrementFaultsSending();
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementFaultsSending(errorCode);
+        }
+    }
+
+    public void incrementTimeoutsSending(MessageContext mc) {
+        incrementTimeoutsSending();
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementTimeoutsSending();
+        }
+    }
+
+    public void incrementBytesSent(MessageContext mc, long size) {
+        incrementBytesSent(size);
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.incrementBytesSent(size);
+        }
+    }
+
+    public void notifyReceivedMessageSize(MessageContext mc, long size) {
+        notifyReceivedMessageSize(size);
+
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.notifyReceivedMessageSize(size);
+        }
+    }
+
+    public void notifySentMessageSize(MessageContext mc, long size) {
+        notifySentMessageSize(size);
+
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.notifySentMessageSize(size);
+        }
+    }
+
+    public void reportResponseCode(MessageContext mc, int respCode) {
+        reportResponseCode(respCode);
+
+        MessageLevelMetricsCollector m = getMsgLevelMetrics(mc);
+        if (m != null) {
+            m.reportResponseCode(respCode);
+        }
+    }
 }

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportView.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportView.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportView.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportView.java
 Tue Oct  7 10:33:42 2008
@@ -24,6 +24,8 @@
 import org.apache.axis2.transport.TransportListener;
 import org.apache.axis2.transport.TransportSender;
 
+import java.util.Map;
+
 public class TransportView implements TransportViewMBean {
 
     private static final Log log = LogFactory.getLog(TransportView.class);
@@ -60,6 +62,24 @@
         return -1;
     }
 
+    public long getTimeoutsReceiving() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getTimeoutsReceiving();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getTimeoutsReceiving();
+        }
+        return -1;
+    }
+
+    public long getTimeoutsSending() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getTimeoutsSending();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getTimeoutsSending();
+        }
+        return -1;
+    }
+
     public long getBytesReceived() {
         if (listener != null && listener instanceof ManagementSupport) {
             return ((ManagementSupport) listener).getBytesReceived();
@@ -96,6 +116,69 @@
         return -1;
     }
 
+    public long getMinSizeReceived() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getMinSizeReceived();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getMinSizeReceived();
+        }
+        return -1;
+    }
+
+    public long getMaxSizeReceived() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getMaxSizeReceived();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getMaxSizeReceived();
+        }
+        return -1;
+    }
+
+    public double getAvgSizeReceived() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getAvgSizeReceived();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getAvgSizeReceived();
+        }
+        return -1;
+    }
+
+    public long getMinSizeSent() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getMinSizeSent();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getMinSizeSent();
+        }
+        return -1;
+    }
+
+    public long getMaxSizeSent() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getMaxSizeSent();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getMaxSizeSent();
+        }
+        return -1;
+    }
+
+    public double getAvgSizeSent() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getAvgSizeSent();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getAvgSizeSent();
+        }
+        return -1;
+    }
+
+    public Map getResponseCodeTable() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getResponseCodeTable();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getResponseCodeTable();
+        }
+        return null;
+    }    
+
     public int getActiveThreadCount() {
         if (listener != null && listener instanceof ManagementSupport) {
             return ((ManagementSupport) listener).getActiveThreadCount();
@@ -154,6 +237,28 @@
     }
 
     public void resetStatistics() {
-        log.info("Operation not supported over JMX");
+        if (listener != null && listener instanceof ManagementSupport) {
+            ((ManagementSupport) listener).resetStatistics();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            ((ManagementSupport) sender).resetStatistics();
+        }
+    }
+
+    public long getLastResetTime() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return ((ManagementSupport) listener).getLastResetTime();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return ((ManagementSupport) sender).getLastResetTime();
+        }
+        return -1;
     }
+
+    public long getMetricsWindow() {
+        if (listener != null && listener instanceof ManagementSupport) {
+            return System.currentTimeMillis() - ((ManagementSupport) 
listener).getLastResetTime();
+        } else if (sender != null && sender instanceof ManagementSupport) {
+            return System.currentTimeMillis() - ((ManagementSupport) 
sender).getLastResetTime();
+        }
+        return -1;
+    }    
 }

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportViewMBean.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportViewMBean.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportViewMBean.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/TransportViewMBean.java
 Tue Oct  7 10:33:42 2008
@@ -18,18 +18,28 @@
  */
 
 package org.apache.axis2.transport.base;
+import java.util.Map;
 
 public interface TransportViewMBean {
 
     // JMX Attributes
     public long getMessagesReceived();
     public long getFaultsReceiving();
+    public long getTimeoutsReceiving();
     public long getMessagesSent();
     public long getFaultsSending();
+    public long getTimeoutsSending();
     public long getBytesReceived();
     public long getBytesSent();
+    public long getMinSizeReceived();
+    public long getMaxSizeReceived();
+    public double getAvgSizeReceived();
+    public long getMinSizeSent();
+    public long getMaxSizeSent();
+    public double getAvgSizeSent();
     public int  getActiveThreadCount();
     public int getQueueSize();
+    public Map getResponseCodeTable();
 
     // JMX Operations
     public void start() throws Exception;
@@ -39,4 +49,6 @@
     public void maintenenceShutdown(long seconds) throws Exception;
 
     public void resetStatistics();
+    public long getLastResetTime();
+    public long getMetricsWindow();
 }

Added: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeThreadFactory.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeThreadFactory.java?rev=702553&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeThreadFactory.java
 (added)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeThreadFactory.java
 Tue Oct  7 10:33:42 2008
@@ -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.
+ */
+
+package org.apache.axis2.transport.base.threads;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * This is a simple ThreadFactory implementation using java.util.concurrent
+ * Creates threads with the given name prefix
+ */
+public class NativeThreadFactory implements
+    ThreadFactory {
+
+    final ThreadGroup group;
+    final AtomicInteger count;
+    final String namePrefix;
+
+    public NativeThreadFactory(final ThreadGroup group, final String 
namePrefix) {
+        super();
+        this.count = new AtomicInteger(1);
+        this.group = group;
+        this.namePrefix = namePrefix;
+    }
+
+    public Thread newThread(final Runnable runnable) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(this.namePrefix);
+        buffer.append('-');
+        buffer.append(this.count.getAndIncrement());
+        Thread t = new Thread(group, runnable, buffer.toString(), 0);
+        t.setDaemon(false);
+        t.setPriority(Thread.NORM_PRIORITY);
+        return t;
+    }
+}
\ No newline at end of file

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeWorkerPool.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeWorkerPool.java?rev=702553&r1=702552&r2=702553&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeWorkerPool.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/transport/base/threads/NativeWorkerPool.java
 Tue Oct  7 10:33:42 2008
@@ -51,8 +51,16 @@
             new NativeThreadFactory(new ThreadGroup(threadGroupName), 
threadGroupId));
     }
 
-    public void execute(Runnable task) {
-        executor.execute(task);
+    public void execute(final Runnable task) {
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    task.run();
+                } catch (Exception ignore) {
+                    // this is to re-use this thread, even if it threw a 
RuntimeException
+                }
+            }
+        });
     }
 
     public int getActiveCount() {
@@ -67,35 +75,4 @@
         executor.shutdown();
         executor.awaitTermination(timeout, TimeUnit.MILLISECONDS);
     }
-
-    /**
-     * This is a simple ThreadFactory implementation using java.util.concurrent
-     * Creates threads with the given name prefix
-     */
-    public class NativeThreadFactory implements
-        ThreadFactory {
-
-        final ThreadGroup group;
-        final AtomicInteger count;
-        final String namePrefix;
-
-        public NativeThreadFactory(final ThreadGroup group, final String 
namePrefix) {
-            super();
-            this.count = new AtomicInteger(1);
-            this.group = group;
-            this.namePrefix = namePrefix;
-        }
-
-        public Thread newThread(final Runnable runnable) {
-            StringBuffer buffer = new StringBuffer();
-            buffer.append(this.namePrefix);
-            buffer.append('-');
-            buffer.append(this.count.getAndIncrement());
-            Thread t = new Thread(group, runnable, buffer.toString(), 0);
-            t.setDaemon(false);
-            t.setPriority(Thread.NORM_PRIORITY);
-            return t;
-        }
-
-    }
 }


Reply via email to