Author: azeez
Date: Mon Jan 14 23:07:46 2008
New Revision: 12235

Log:

Using a memory base trce persister to improve performance



Modified:
   trunk/commons/tracer/src/main/java/org/wso2/tracer/TracerConstants.java
   
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/MemoryBasedTracePersister.java
   trunk/commons/tracer/src/main/java/org/wso2/tracer/module/TracePersister.java
   
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/handler/TracingHandler.java
   trunk/wsas/java/modules/core/conf/axis2.xml
   
trunk/wsas/java/modules/core/src/org/wso2/wsas/persistence/dao/MessageDAO.java
   trunk/wsas/java/modules/core/src/org/wso2/wsas/util/TracePersisterImpl.java

Modified: 
trunk/commons/tracer/src/main/java/org/wso2/tracer/TracerConstants.java
==============================================================================
--- trunk/commons/tracer/src/main/java/org/wso2/tracer/TracerConstants.java     
(original)
+++ trunk/commons/tracer/src/main/java/org/wso2/tracer/TracerConstants.java     
Mon Jan 14 23:07:46 2008
@@ -21,7 +21,7 @@
 public final class TracerConstants {
 
     public static final String MSG_SEQ_BUFFER = "wso2tracer.msg.seq.buff";
-    public static final int MSG_SEQ_BUFFER_SZ = 50;
+    public static final int MSG_BUFFER_SZ = 50;
     public static final String TRACING_STATUS = "wso2tracer.status";
 
     public static final String TRACE_PERSISTER_IMPL = 
"wso2tracer.trace.persister.impl";

Modified: 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/MemoryBasedTracePersister.java
==============================================================================
--- 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/MemoryBasedTracePersister.java
    (original)
+++ 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/MemoryBasedTracePersister.java
    Mon Jan 14 23:07:46 2008
@@ -15,40 +15,104 @@
  */
 package org.wso2.tracer.module;
 
-import org.apache.axis2.context.MessageContext;
 import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axis2.context.MessageContext;
+import org.wso2.tracer.TracerConstants;
+import org.wso2.tracer.TracerUtils;
+import org.wso2.utils.CircularBuffer;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
- * 
+ *  A memory based trace persister which holds the traced messages in a 
cicular buffer
  */
-public class MemoryBasedTracePersister implements TracePersister{
+public class MemoryBasedTracePersister implements TracePersister {
+    private static final String TRACING_MAP = "local_wso2tracer.map";
+    private static final String REQUEST_NUMBER = 
"local_wso2tracer.request.number";
+
+    private MessageContext msgContext;
+    private CircularBuffer msgBuffer = new 
CircularBuffer(TracerConstants.MSG_BUFFER_SZ);
+    private String tracingStatus;
 
     public void setMsgContext(MessageContext msgContext) {
-        //TODO: Method implementation
-
+        this.msgContext = msgContext;
     }
 
-    public long saveMessage(String operationName, String serviceName, int 
messageFlow,
-                            SOAPEnvelope env) {
-        //TODO: Method implementation
-        return 0;
+    public synchronized long saveMessage(String operationName, String 
serviceName,
+                                         int messageFlow, SOAPEnvelope env) {
+        long msgSequence = getMessageSequence(serviceName, operationName);
+        TraceMessage message = new TraceMessage(operationName, serviceName,
+                                                messageFlow,
+                                                msgSequence,
+                                                env);
+        msgBuffer.append(message);
+        return msgSequence;
     }
 
     public void saveTraceStatus(String onOff) {
-        //TODO: Method implementation
-
+        this.tracingStatus = onOff;
     }
 
     public boolean isTracingEnabled() {
-        //TODO: Method implementation
-        return false;
+        return tracingStatus != null && tracingStatus.equalsIgnoreCase("ON");
     }
 
-    public String[] getMessages(String serviceId,
+    public synchronized String[] getMessages(String serviceId,
                                 String operationName,
                                 long messageSequence) {
-        //TODO: Method implementation
-        return new String[0];
+        String[] responses = new String[2];
+        Object[] objects = msgBuffer.getObjects(TracerConstants.MSG_BUFFER_SZ);
+        for (int i = 0; i < objects.length; i++) {
+            TraceMessage msg = (TraceMessage) objects[i];
+            if (msg.getOperationName().equals(operationName) &&
+                msg.getServiceName().equals(serviceId) &&
+                msg.getMsgSequence() == messageSequence) {
+                int messageFlow = msg.getMessageFlow();
+                if (messageFlow == MessageContext.IN_FLOW ||
+                    messageFlow == MessageContext.IN_FAULT_FLOW) {
+                    responses[0] = 
TracerUtils.getPrettyString(msg.getSoapEnvelope(),
+                                                               msgContext);
+                } else if (messageFlow == MessageContext.OUT_FLOW ||
+                           messageFlow == MessageContext.OUT_FAULT_FLOW) {
+                    responses[1] = 
TracerUtils.getPrettyString(msg.getSoapEnvelope(),
+                                                               msgContext);
+                }
+            }
+        }
+        return responses;
     }
 
+    private long getMessageSequence(String serviceName, String operationName) {
+        long msgSequence = 1;
+
+        // check whether this is a continuation of an existing MEP
+        Object requestNumber = 
msgContext.getOperationContext().getProperty(REQUEST_NUMBER);
+        if ((requestNumber != null) && requestNumber instanceof Long) {
+            msgSequence = ((Long) requestNumber).intValue();
+        } else {
+            // Need to have a counter for each and operation
+            Map monitoringHandlerMap =
+                    (Map) 
msgContext.getConfigurationContext().getProperty(TRACING_MAP);
+
+            if (monitoringHandlerMap == null) {
+                monitoringHandlerMap = new HashMap();
+                msgContext.getConfigurationContext().setProperty(TRACING_MAP,
+                                                                 
monitoringHandlerMap);
+            }
+
+            String key = serviceName + "." + operationName;
+            Object counterInt = monitoringHandlerMap.get(key);
+            if (counterInt == null) {
+                msgSequence = 0;
+            } else if (counterInt instanceof Long) {
+                msgSequence = ((Long) counterInt).intValue() + 1;
+            }
+
+            monitoringHandlerMap.put(key, new Long(msgSequence));
+            msgContext.getOperationContext().setProperty(REQUEST_NUMBER, new 
Long(msgSequence));
+        }
+
+        return msgSequence;
+    }
 }

Modified: 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/TracePersister.java
==============================================================================
--- 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/TracePersister.java   
    (original)
+++ 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/TracePersister.java   
    Mon Jan 14 23:07:46 2008
@@ -19,21 +19,49 @@
 import org.apache.axiom.soap.SOAPEnvelope;
 
 /**
- * 
+ * The interface used for persisting trace messages
  */
 public interface TracePersister {
 
+    /**
+     * Set the MessageContext
+     * @param msgContext The MessageContext
+     */
     public void setMsgContext(MessageContext msgContext);
 
+    /**
+     * Save a message
+     * 
+     * @param operationName
+     * @param serviceName
+     * @param messageFlow
+     * @param env
+     * @return The sequence number of the saved message
+     */
     public long saveMessage(String operationName,
                             String serviceName,
                             int messageFlow,
                             SOAPEnvelope env);
 
+    /**
+     * Set the status of the Tracer. Tracer can be either on or off
+     * @param onOff
+     */
     public void saveTraceStatus(String onOff);
 
+    /**
+     * Check whether trcing is enabled
+     * @return
+     */
     public boolean isTracingEnabled();
 
+    /**
+     * Get all the persisted messages for an opera 
+     * @param serviceId
+     * @param operationName
+     * @param messageSequence
+     * @return
+     */
     public String[] getMessages(String serviceId,
                                 String operationName,
                                 long messageSequence);

Modified: 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/handler/TracingHandler.java
==============================================================================
--- 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/handler/TracingHandler.java
       (original)
+++ 
trunk/commons/tracer/src/main/java/org/wso2/tracer/module/handler/TracingHandler.java
       Mon Jan 14 23:07:46 2008
@@ -74,7 +74,7 @@
                         (CircularBuffer) 
configCtx.getProperty(TracerConstants.MSG_SEQ_BUFFER);
 
                 if (msgSeqBuff == null) {
-                    msgSeqBuff = new 
CircularBuffer(TracerConstants.MSG_SEQ_BUFFER_SZ);
+                    msgSeqBuff = new 
CircularBuffer(TracerConstants.MSG_BUFFER_SZ);
                     configCtx.setProperty(TracerConstants.MSG_SEQ_BUFFER, 
msgSeqBuff);
                 }
 

Modified: trunk/wsas/java/modules/core/conf/axis2.xml
==============================================================================
--- trunk/wsas/java/modules/core/conf/axis2.xml (original)
+++ trunk/wsas/java/modules/core/conf/axis2.xml Mon Jan 14 23:07:46 2008
@@ -34,8 +34,17 @@
     <parameter name="wso2tracer.trace.filter.impl">
         org.wso2.wsas.util.TraceFilterImpl
     </parameter>
+
+    <!--
+       This parameter decides where the traced messages from the Tracer is 
persisted.
+
+       There are two possible values:
+
+       1. org.wso2.wsas.util.TracePersisterImpl - Persists all messages in the 
database
+       2. org.wso2.tracer.module.MemoryBasedTracePersister - Keeps all traced 
messages in main memory
+    -->
     <parameter name="wso2tracer.trace.persister.impl">
-        org.wso2.wsas.util.TracePersisterImpl
+        org.wso2.tracer.module.MemoryBasedTracePersister
     </parameter>
 
     <!-- Following parameter will completely disable REST handling in both the 
servlets-->

Modified: 
trunk/wsas/java/modules/core/src/org/wso2/wsas/persistence/dao/MessageDAO.java
==============================================================================
--- 
trunk/wsas/java/modules/core/src/org/wso2/wsas/persistence/dao/MessageDAO.java  
    (original)
+++ 
trunk/wsas/java/modules/core/src/org/wso2/wsas/persistence/dao/MessageDAO.java  
    Mon Jan 14 23:07:46 2008
@@ -20,6 +20,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
+import org.hibernate.Query;
 import org.wso2.wsas.persistence.dataobject.MessageDO;
 import org.wso2.wsas.persistence.dataobject.OperationDO;
 import org.wso2.wsas.persistence.dataobject.ServiceDO;
@@ -141,7 +142,9 @@
         Session session = hbConfig.currentSession();
         Transaction tx = session.beginTransaction();
         try {
-            List list = session.createQuery(query).list();
+            Query hbQuery = session.createQuery(query);
+            hbQuery.setMaxResults(100);
+            List list = hbQuery.list();
             tx.commit();
             return (MessageDO[]) list.toArray(new MessageDO[list.size()]);
         } catch (Throwable e) {

Modified: 
trunk/wsas/java/modules/core/src/org/wso2/wsas/util/TracePersisterImpl.java
==============================================================================
--- trunk/wsas/java/modules/core/src/org/wso2/wsas/util/TracePersisterImpl.java 
(original)
+++ trunk/wsas/java/modules/core/src/org/wso2/wsas/util/TracePersisterImpl.java 
Mon Jan 14 23:07:46 2008
@@ -22,6 +22,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.wso2.tracer.TracerConstants;
+import org.wso2.tracer.TracerUtils;
 import org.wso2.tracer.module.TracePersister;
 import org.wso2.utils.xml.XMLPrettyPrinter;
 import org.wso2.wsas.persistence.PersistenceManager;
@@ -37,8 +38,8 @@
  *
  */
 public class TracePersisterImpl implements TracePersister {
-    private static final String TRACING_MAP = "local_wso2wsas.tracer.map";
-    private static final String REQUEST_NUMBER = 
"local_wso2wsas.tracer.request.number";
+    private static final String TRACING_MAP = "local_wso2tracer.map";
+    private static final String REQUEST_NUMBER = 
"local_wso2tracer.request.number";
 
     private static Log log = LogFactory.getLog(TracePersisterImpl.class);
     private MessageContext msgContext;
@@ -67,7 +68,7 @@
         String xml;
 
         try {
-            xml = getPrettyString(env);
+            xml = TracerUtils.getPrettyString(env, msgContext);
         } catch (Exception e) {
             String msg = " The received SOAP Message could not be serialized";
             log.warn(msg, e);
@@ -159,12 +160,4 @@
 
         return msgSequence;
     }
-
-    private String getPrettyString(SOAPEnvelope env) {
-        InputStream xmlIn = new 
ByteArrayInputStream(env.toString().getBytes());
-        String encoding =
-                (String) 
msgContext.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
-        XMLPrettyPrinter xmlPrettyPrinter = new XMLPrettyPrinter(xmlIn, 
encoding);
-        return xmlPrettyPrinter.xmlFormat();
-    }
 }

_______________________________________________
Wsas-java-dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/wsas-java-dev

Reply via email to