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