Author: cschneider Date: Fri Oct 7 15:33:53 2011 New Revision: 1180079 URL: http://svn.apache.org/viewvc?rev=1180079&view=rev Log: CAMEL-4500 Fix to always run the default tracing before the jmx notifications
Added: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java?rev=1180079&r1=1180078&r2=1180079&view=diff ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java (original) +++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java Fri Oct 7 15:33:53 2011 @@ -27,6 +27,7 @@ import org.apache.camel.Message; import org.apache.camel.Processor; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.processor.Traceable; +import org.apache.camel.processor.interceptor.DefaultTraceEventHandler; import org.apache.camel.processor.interceptor.TraceEventHandler; import org.apache.camel.processor.interceptor.TraceInterceptor; import org.apache.camel.processor.interceptor.Tracer; @@ -39,22 +40,26 @@ public final class JMXNotificationTraceE private long num; private NotificationPublisher notificationSender; private Tracer tracer; + private DefaultTraceEventHandler defaultTracer; public JMXNotificationTraceEventHandler(Tracer tracer) { this.tracer = tracer; + this.defaultTracer = new DefaultTraceEventHandler(tracer); } @SuppressWarnings("rawtypes") public void traceExchangeOut(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange, Object traceState) throws Exception { + defaultTracer.traceExchangeOut(node, target, traceInterceptor, exchange, traceState); } @SuppressWarnings("rawtypes") public Object traceExchangeIn(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception { - return null; + return defaultTracer.traceExchangeIn(node, target, traceInterceptor, exchange); } @SuppressWarnings("rawtypes") public void traceExchange(ProcessorDefinition node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception { + defaultTracer.traceExchange(node, target, traceInterceptor, exchange); if (notificationSender != null && tracer.isJmxTraceNotifications()) { String body = MessageHelper.extractBodyForLogging(exchange.getIn(), "", false, tracer.getTraceBodySize()); Added: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java?rev=1180079&view=auto ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java (added) +++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceEventHandler.java Fri Oct 7 15:33:53 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); + } + } + +} Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java?rev=1180079&r1=1180078&r2=1180079&view=diff ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java (original) +++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java Fri Oct 7 15:33:53 2011 @@ -16,17 +16,12 @@ */ 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 +41,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; @@ -65,10 +58,8 @@ public class TraceInterceptor extends De 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) { super(target); @@ -79,8 +70,8 @@ public class TraceInterceptor extends De if (tracer.getFormatter() != null) { this.formatter = tracer.getFormatter(); } - this.traceHandler = tracer.getTraceHandler(); - this.jpaTraceEventMessageClassName = tracer.getJpaTraceEventMessageClassName(); + this.traceHandler = tracer.getTraceHandler() != null ? tracer.getTraceHandler() + : new DefaultTraceEventHandler(tracer); } @Override @@ -305,84 +296,15 @@ 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."); - } - } + traceHandler.traceExchange(node, processor, this, exchange); } protected Object traceExchangeIn(Exchange exchange) throws Exception { - if (traceHandler != null) { - return traceHandler.traceExchangeIn(node, processor, this, exchange); - } else { - traceExchange(exchange); - } - return null; + return traceHandler.traceExchangeIn(node, processor, this, exchange); } protected void traceExchangeOut(Exchange exchange, Object traceState) throws Exception { - if (traceHandler != null) { - traceHandler.traceExchangeOut(node, processor, this, exchange, traceState); - } else { - traceExchange(exchange); - } + traceHandler.traceExchangeOut(node, processor, this, exchange, traceState); } protected void logException(Exchange exchange, Throwable throwable) { @@ -429,16 +351,6 @@ 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();