You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cs...@apache.org on 2011/10/05 12:46:45 UTC

svn commit: r1179153 - in /camel/trunk/camel-core/src/main/java/org/apache/camel: management/ management/mbean/ processor/interceptor/

Author: cschneider
Date: Wed Oct  5 10:46:45 2011
New Revision: 1179153

URL: http://svn.apache.org/viewvc?rev=1179153&view=rev
Log:
CAMEL-4500 Adding a TraceEventHandler that supports JMX Notifications. Moving the standard trace logic to a new TraceEventHandler

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java   (with props)
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java   (with props)
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DispatchingTraceEventHandler.java   (with props)
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java?rev=1179153&r1=1179152&r2=1179153&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java Wed Oct  5 10:46:45 2011
@@ -101,6 +101,7 @@ public class DefaultManagementLifecycleS
     private CamelContext camelContext;
     private volatile boolean initialized;
     private final Set<String> knowRouteIds = new HashSet<String>();
+    private Map<Object, ManagedTracer> managedTracers = new HashMap<Object, ManagedTracer>();
 
     public DefaultManagementLifecycleStrategy() {
     }
@@ -395,9 +396,14 @@ public class DefaultManagementLifecycleS
             return ((ManagementAware) service).getManagedObject(service);
         } else if (service instanceof Tracer) {
             // special for tracer
-            ManagedTracer mt = new ManagedTracer(context, (Tracer) service);
-            mt.init(getManagementStrategy());
-            return mt;
+            Object mo = this.managedTracers.get(service);
+            if (mo == null) {
+                ManagedTracer mt = new ManagedTracer(context, (Tracer) service);
+                mt.init(getManagementStrategy());
+                this.managedTracers.put(service, mt);
+                mo = mt;
+            }
+            return mo;
         } else if (service instanceof EventNotifier) {
             answer = getManagementObjectStrategy().getManagedObjectForEventNotifier(context, (EventNotifier) service);
         } else if (service instanceof Producer) {

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java?rev=1179153&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java Wed Oct  5 10:46:45 2011
@@ -0,0 +1,108 @@
+/**
+ * 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.camel.management.mbean;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.Notification;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.Traceable;
+import org.apache.camel.api.management.NotificationSender;
+import org.apache.camel.api.management.NotificationSenderAware;
+import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.processor.interceptor.TraceEventHandler;
+import org.apache.camel.processor.interceptor.TraceInterceptor;
+
+public final class JMXNotificationTraceEventHandler implements TraceEventHandler, NotificationSenderAware {
+    private long num;
+    private NotificationSender notificationSender;
+
+    public JMXNotificationTraceEventHandler() {
+    }
+
+    @SuppressWarnings("rawtypes")
+    public void traceExchangeOut(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange, Object traceState) throws Exception {
+    }
+
+    @SuppressWarnings("rawtypes")
+    public Object traceExchangeIn(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+        return null;
+    }
+
+    @SuppressWarnings("rawtypes")
+    public void traceExchange(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+        if (notificationSender != null) {
+            String body = exchange.getIn().getBody(String.class);
+            if (body == null) {
+                body = "";
+            }
+            String message = body.substring(0, Math.min(body.length(), 60));
+            Map tm = createTraceMessage(node, exchange, body);
+
+            Notification notification = new Notification("TraceNotification", exchange.toString(), num++, System.currentTimeMillis(), message);
+            notification.setUserData(tm);
+
+            notificationSender.sendNotification(notification);
+        }
+
+    }
+
+    private Map<String, Object> createTraceMessage(ProcessorDefinition<?> node, Exchange exchange, String body) {
+        Map<String, Object> mi = new HashMap<String, Object>();
+        mi.put("ExchangeId", exchange.getExchangeId());
+        mi.put("EndpointURI", getEndpointUri(node));
+        mi.put("TimeStamp", new Date(System.currentTimeMillis()));
+        mi.put("Body", body);
+
+        Message message = exchange.getIn();
+        Map<String, Object> sHeaders = message.getHeaders();
+        Map<String, Object> sProperties = exchange.getProperties();
+
+        Map<String, String> headers = new HashMap<String, String>();
+        for (String key : sHeaders.keySet()) {
+            headers.put(key, message.getHeader(key, String.class));
+        }
+        mi.put("Headers", headers);
+
+        Map<String, String> properties = new HashMap<String, String>();
+        for (String key : sProperties.keySet()) {
+            properties.put(key, exchange.getProperty(key, String.class));
+        }
+        mi.put("Properties", properties);
+        return mi;
+    }
+
+    private String getEndpointUri(ProcessorDefinition<?> node) {
+        if (node instanceof Traceable) {
+            Traceable tr = (Traceable)node;
+            return tr.getTraceLabel();
+        } else {
+            return node.getLabel();
+        }
+    }
+
+    @Override
+    public void setNotificationSender(NotificationSender sender) {
+        this.notificationSender = sender;
+    }
+
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java?rev=1179153&r1=1179152&r2=1179153&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java Wed Oct  5 10:46:45 2011
@@ -19,7 +19,13 @@ package org.apache.camel.management.mbea
 import org.apache.camel.CamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedNotification;
+import org.apache.camel.api.management.ManagedNotifications;
 import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.NotificationSender;
+import org.apache.camel.api.management.NotificationSenderAware;
+import org.apache.camel.processor.interceptor.DispatchingTraceEventHandler;
+import org.apache.camel.processor.interceptor.TraceEventHandler;
 import org.apache.camel.processor.interceptor.Tracer;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.util.ObjectHelper;
@@ -28,13 +34,27 @@ import org.apache.camel.util.ObjectHelpe
  * @version 
  */
 @ManagedResource(description = "Managed Tracer")
-public class ManagedTracer {
+@ManagedNotifications(@ManagedNotification(name = "javax.management.Notification", 
+    description = "Fine grained trace events", 
+    notificationTypes = {"TraceNotification"}))
+public class ManagedTracer implements NotificationSenderAware {
     private final CamelContext camelContext;
     private final Tracer tracer;
+    private JMXNotificationTraceEventHandler jmxTraceHandler;
 
     public ManagedTracer(CamelContext camelContext, Tracer tracer) {
         this.camelContext = camelContext;
         this.tracer = tracer;
+        TraceEventHandler oldHandler = tracer.getTraceHandler();
+        jmxTraceHandler = new JMXNotificationTraceEventHandler();
+        if (oldHandler != null) {
+            DispatchingTraceEventHandler teh = new DispatchingTraceEventHandler();
+            teh.addHandler(oldHandler);
+            teh.addHandler(jmxTraceHandler);
+            tracer.setTraceHandler(teh);
+        } else {
+            tracer.setTraceHandler(jmxTraceHandler);
+        }
     }
 
     public void init(ManagementStrategy strategy) {
@@ -410,4 +430,9 @@ public class ManagedTracer {
         tracer.getDefaultTraceFormatter().setMaxChars(maxChars);
     }
 
+    @Override
+    public void setNotificationSender(NotificationSender sender) {
+        jmxTraceHandler.setNotificationSender(sender);
+    }
+
 }

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java?rev=1179153&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java Wed Oct  5 10:46:45 2011
@@ -0,0 +1,148 @@
+/**
+ * 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.camel.processor.interceptor;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.Service;
+import org.apache.camel.impl.DefaultExchange;
+import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.ServiceHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultTraceEventHandler implements TraceEventHandler, Service {
+    private static final transient Logger LOG = LoggerFactory.getLogger(DefaultTraceEventHandler.class);
+    
+    private Producer traceEventProducer;
+    private Class<?> jpaTraceEventMessageClass;
+    private String jpaTraceEventMessageClassName;
+
+    private final Tracer tracer;
+    
+    public DefaultTraceEventHandler(Tracer tracer) {
+        this.tracer = tracer;
+    }
+
+    private synchronized void loadJpaTraceEventMessageClass(Exchange exchange) {
+        if (jpaTraceEventMessageClass == null) {
+            jpaTraceEventMessageClassName = tracer.getJpaTraceEventMessageClassName();
+        }
+        if (jpaTraceEventMessageClass == null) {
+            jpaTraceEventMessageClass = exchange.getContext().getClassResolver().resolveClass(jpaTraceEventMessageClassName);
+            if (jpaTraceEventMessageClass == null) {
+                throw new IllegalArgumentException("Cannot find class: " + jpaTraceEventMessageClassName
+                        + ". Make sure camel-jpa.jar is in the classpath.");
+            }
+        }
+    }
+
+    private synchronized Producer getTraceEventProducer(Exchange exchange) throws Exception {
+        if (traceEventProducer == null) {
+            // create producer when we have access the the camel context (we dont in doStart)
+            Endpoint endpoint = tracer.getDestination() != null ? tracer.getDestination() : exchange.getContext().getEndpoint(tracer.getDestinationUri());
+            traceEventProducer = endpoint.createProducer();
+            ServiceHelper.startService(traceEventProducer);
+        }
+        return traceEventProducer;
+    }
+
+    @Override
+    public void traceExchange(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+        if (tracer.getDestination() != null || tracer.getDestinationUri() != null) {
+
+            // create event exchange and add event information
+            Date timestamp = new Date();
+            Exchange event = new DefaultExchange(exchange);
+            event.setProperty(Exchange.TRACE_EVENT_NODE_ID, node.getId());
+            event.setProperty(Exchange.TRACE_EVENT_TIMESTAMP, timestamp);
+            // keep a reference to the original exchange in case its needed
+            event.setProperty(Exchange.TRACE_EVENT_EXCHANGE, exchange);
+
+            // create event message to sent as in body containing event information such as
+            // from node, to node, etc.
+            TraceEventMessage msg = new DefaultTraceEventMessage(timestamp, node, exchange);
+
+            // should we use ordinary or jpa objects
+            if (tracer.isUseJpa()) {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Using class: " + this.jpaTraceEventMessageClassName + " for tracing event messages");
+                }
+
+                // load the jpa event message class
+                loadJpaTraceEventMessageClass(exchange);
+                // create a new instance of the event message class
+                Object jpa = ObjectHelper.newInstance(jpaTraceEventMessageClass);
+
+                // copy options from event to jpa
+                Map<String, Object> options = new HashMap<String, Object>();
+                IntrospectionSupport.getProperties(msg, options, null);
+                IntrospectionSupport.setProperties(jpa, options);
+                // and set the timestamp as its not a String type
+                IntrospectionSupport.setProperty(jpa, "timestamp", msg.getTimestamp());
+
+                event.getIn().setBody(jpa);
+            } else {
+                event.getIn().setBody(msg);
+            }
+
+            // marker property to indicate its a tracing event being routed in case
+            // new Exchange instances is created during trace routing so we can check
+            // for this marker when interceptor also kick in during routing of trace events
+            event.setProperty(Exchange.TRACE_EVENT, Boolean.TRUE);
+            try {
+                // process the trace route
+                getTraceEventProducer(exchange).process(event);
+            } catch (Exception e) {
+                // log and ignore this as the original Exchange should be allowed to continue
+                LOG.error("Error processing trace event (original Exchange will continue): " + event, e);
+            }
+        }
+    }
+
+    @Override
+    public Object traceExchangeIn(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+        traceExchange(node, target, traceInterceptor, exchange);
+        return null;
+    }
+
+    @Override
+    public void traceExchangeOut(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange, Object traceState) throws Exception {
+        traceExchange(node, target, traceInterceptor, exchange);
+    }
+
+    @Override
+    public void start() throws Exception {
+        traceEventProducer = null;
+    }
+
+    @Override
+    public void stop() throws Exception {
+        if (traceEventProducer != null) {
+            ServiceHelper.stopService(traceEventProducer);
+        }
+    }
+
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DispatchingTraceEventHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DispatchingTraceEventHandler.java?rev=1179153&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DispatchingTraceEventHandler.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DispatchingTraceEventHandler.java Wed Oct  5 10:46:45 2011
@@ -0,0 +1,61 @@
+/**
+ * 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.camel.processor.interceptor;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.model.ProcessorDefinition;
+
+public class DispatchingTraceEventHandler implements TraceEventHandler {
+    
+    private Set<TraceEventHandler> handlers = new HashSet<TraceEventHandler>();
+    
+    public void addHandler(TraceEventHandler handler) {
+        handlers.add(handler);
+    }
+    
+    public void removeHandler(TraceEventHandler handler) {
+        handlers.remove(handler);
+    }
+
+    @Override
+    public void traceExchange(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+        for (TraceEventHandler handler : handlers) {
+            handler.traceExchange(node, target, traceInterceptor, exchange);
+        }
+    }
+
+    @Override
+    public Object traceExchangeIn(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+        Object result = null;
+        for (TraceEventHandler handler : handlers) {
+            result = handler.traceExchangeIn(node, target, traceInterceptor, exchange);
+        }
+        return result;
+    }
+
+    @Override
+    public void traceExchangeOut(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange, Object traceState) throws Exception {
+        for (TraceEventHandler handler : handlers) {
+            handler.traceExchangeOut(node, target, traceInterceptor, exchange, traceState);
+        }
+    }
+
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/DispatchingTraceEventHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java?rev=1179153&r1=1179152&r2=1179153&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java Wed Oct  5 10:46:45 2011
@@ -16,17 +16,10 @@
  */
 package org.apache.camel.processor.interceptor;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.camel.AsyncCallback;
-import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
-import org.apache.camel.Producer;
 import org.apache.camel.impl.AggregateRouteNode;
-import org.apache.camel.impl.DefaultExchange;
 import org.apache.camel.impl.DefaultRouteNode;
 import org.apache.camel.impl.DoCatchRouteNode;
 import org.apache.camel.impl.DoFinallyRouteNode;
@@ -46,8 +39,6 @@ import org.apache.camel.spi.ExchangeForm
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.spi.TracedRouteNodes;
-import org.apache.camel.util.IntrospectionSupport;
-import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ServiceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,16 +52,15 @@ public class TraceInterceptor extends De
     private static final transient Logger LOG = LoggerFactory.getLogger(TraceInterceptor.class);
 
     private CamelLogProcessor logger;
-    private Producer traceEventProducer;
-    private final ProcessorDefinition node;
+
+    private final ProcessorDefinition<?> node;
     private final Tracer tracer;
     private TraceFormatter formatter;
-    private Class<?> jpaTraceEventMessageClass;
+
     private RouteContext routeContext;
     private TraceEventHandler traceHandler;
-    private String jpaTraceEventMessageClassName;
 
-    public TraceInterceptor(ProcessorDefinition node, Processor target, TraceFormatter formatter, Tracer tracer) {
+    public TraceInterceptor(ProcessorDefinition<?> node, Processor target, TraceFormatter formatter, Tracer tracer) {
         super(target);
         this.tracer = tracer;
         this.node = node;
@@ -80,7 +70,6 @@ public class TraceInterceptor extends De
             this.formatter = tracer.getFormatter();
         }
         this.traceHandler = tracer.getTraceHandler();
-        this.jpaTraceEventMessageClassName = tracer.getJpaTraceEventMessageClassName();
     }
 
     @Override
@@ -307,64 +296,6 @@ public class TraceInterceptor extends De
     protected void traceExchange(Exchange exchange) throws Exception {
         if (traceHandler != null) {
             traceHandler.traceExchange(node, processor, this, exchange);
-        } else if (tracer.getDestination() != null || tracer.getDestinationUri() != null) {
-
-            // create event exchange and add event information
-            Date timestamp = new Date();
-            Exchange event = new DefaultExchange(exchange);
-            event.setProperty(Exchange.TRACE_EVENT_NODE_ID, node.getId());
-            event.setProperty(Exchange.TRACE_EVENT_TIMESTAMP, timestamp);
-            // keep a reference to the original exchange in case its needed
-            event.setProperty(Exchange.TRACE_EVENT_EXCHANGE, exchange);
-
-            // create event message to sent as in body containing event information such as
-            // from node, to node, etc.
-            TraceEventMessage msg = new DefaultTraceEventMessage(timestamp, node, exchange);
-
-            // should we use ordinary or jpa objects
-            if (tracer.isUseJpa()) {
-                if (LOG.isTraceEnabled()) {
-                    LOG.trace("Using class: " + this.jpaTraceEventMessageClassName + " for tracing event messages");
-                }
-
-                // load the jpa event message class
-                loadJpaTraceEventMessageClass(exchange);
-                // create a new instance of the event message class
-                Object jpa = ObjectHelper.newInstance(jpaTraceEventMessageClass);
-
-                // copy options from event to jpa
-                Map<String, Object> options = new HashMap<String, Object>();
-                IntrospectionSupport.getProperties(msg, options, null);
-                IntrospectionSupport.setProperties(jpa, options);
-                // and set the timestamp as its not a String type
-                IntrospectionSupport.setProperty(jpa, "timestamp", msg.getTimestamp());
-
-                event.getIn().setBody(jpa);
-            } else {
-                event.getIn().setBody(msg);
-            }
-
-            // marker property to indicate its a tracing event being routed in case
-            // new Exchange instances is created during trace routing so we can check
-            // for this marker when interceptor also kick in during routing of trace events
-            event.setProperty(Exchange.TRACE_EVENT, Boolean.TRUE);
-            try {
-                // process the trace route
-                getTraceEventProducer(exchange).process(event);
-            } catch (Exception e) {
-                // log and ignore this as the original Exchange should be allowed to continue
-                LOG.error("Error processing trace event (original Exchange will continue): " + event, e);
-            }
-        }
-    }
-
-    private synchronized void loadJpaTraceEventMessageClass(Exchange exchange) {
-        if (jpaTraceEventMessageClass == null) {
-            jpaTraceEventMessageClass = exchange.getContext().getClassResolver().resolveClass(jpaTraceEventMessageClassName);
-            if (jpaTraceEventMessageClass == null) {
-                throw new IllegalArgumentException("Cannot find class: " + jpaTraceEventMessageClassName
-                        + ". Make sure camel-jpa.jar is in the classpath.");
-            }
         }
     }
 
@@ -372,16 +303,13 @@ public class TraceInterceptor extends De
         if (traceHandler != null) {
             return traceHandler.traceExchangeIn(node, processor, this, exchange);
         } else {
-            traceExchange(exchange);
+            return null;
         }
-        return null;
     }
 
     protected void traceExchangeOut(Exchange exchange, Object traceState) throws Exception {
         if (traceHandler != null) {
             traceHandler.traceExchangeOut(node, processor, this, exchange, traceState);
-        } else {
-            traceExchange(exchange);
         }
     }
 
@@ -429,27 +357,15 @@ public class TraceInterceptor extends De
         return true;
     }
 
-    private synchronized Producer getTraceEventProducer(Exchange exchange) throws Exception {
-        if (traceEventProducer == null) {
-            // create producer when we have access the the camel context (we dont in doStart)
-            Endpoint endpoint = tracer.getDestination() != null ? tracer.getDestination() : exchange.getContext().getEndpoint(tracer.getDestinationUri());
-            traceEventProducer = endpoint.createProducer();
-            ServiceHelper.startService(traceEventProducer);
-        }
-        return traceEventProducer;
-    }
-
     @Override
     protected void doStart() throws Exception {
         super.doStart();
-        traceEventProducer = null;
+        ServiceHelper.startService(traceHandler);
     }
 
     @Override
     protected void doStop() throws Exception {
         super.doStop();
-        if (traceEventProducer != null) {
-            ServiceHelper.stopService(traceEventProducer);
-        }
+        ServiceHelper.stopService(traceHandler);
     }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java?rev=1179153&r1=1179152&r2=1179153&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java Wed Oct  5 10:46:45 2011
@@ -55,6 +55,10 @@ public class Tracer implements Intercept
     private TraceInterceptorFactory traceInterceptorFactory = new DefaultTraceInterceptorFactory();
     private TraceEventHandler traceHandler;
     private String jpaTraceEventMessageClassName = JPA_TRACE_EVENT_MESSAGE;
+    
+    public Tracer() {
+        traceHandler = new DefaultTraceEventHandler(this);
+    }
 
     /**
      * Creates a new tracer.