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.