Author: cschneider
Date: Fri Oct  7 13:47:03 2011
New Revision: 1180036

URL: http://svn.apache.org/viewvc?rev=1180036&view=rev
Log:
CAMEL-4500 Add JMX trace notifications

Added:
    
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java
Modified:
    camel/branches/camel-2.8.x/camel-core/pom.xml
    
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/JmxMBeanAssembler.java
    
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java
    
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java

Modified: camel/branches/camel-2.8.x/camel-core/pom.xml
URL: 
http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/pom.xml?rev=1180036&r1=1180035&r2=1180036&view=diff
==============================================================================
--- camel/branches/camel-2.8.x/camel-core/pom.xml (original)
+++ camel/branches/camel-2.8.x/camel-core/pom.xml Fri Oct  7 13:47:03 2011
@@ -86,10 +86,6 @@
         <!-- we only need spring-context.jar as optional as we need the JMX 
export annotations -->
         <exclusion>
           <groupId>org.springframework</groupId>
-          <artifactId>spring-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.springframework</groupId>
           <artifactId>spring-beans</artifactId>
         </exclusion>
         <exclusion>

Modified: 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/JmxMBeanAssembler.java
URL: 
http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/JmxMBeanAssembler.java?rev=1180036&r1=1180035&r2=1180036&view=diff
==============================================================================
--- 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/JmxMBeanAssembler.java
 (original)
+++ 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/JmxMBeanAssembler.java
 Fri Oct  7 13:47:03 2011
@@ -30,6 +30,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
 import org.springframework.jmx.export.annotation.ManagedResource;
 import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
+import 
org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher;
+import org.springframework.jmx.export.notification.NotificationPublisherAware;
 
 /**
  * An assembler to assemble a {@link 
javax.management.modelmbean.RequiredModelMBean} which can be used
@@ -78,6 +80,11 @@ public class JmxMBeanAssembler {
         } catch (InvalidTargetObjectTypeException e) {
             throw new JMException(e.getMessage());
         }
+        
+        if (obj instanceof NotificationPublisherAware) {
+            NotificationPublisherAware publishereAwareObj = 
(NotificationPublisherAware) obj;
+            publishereAwareObj.setNotificationPublisher(new 
ModelMBeanNotificationPublisher(mbean, name, obj));
+        }
 
         return mbean;
     }

Added: 
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=1180036&view=auto
==============================================================================
--- 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java
 (added)
+++ 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/JMXNotificationTraceEventHandler.java
 Fri Oct  7 13:47:03 2011
@@ -0,0 +1,114 @@
+/**
+ * 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.model.ProcessorDefinition;
+import org.apache.camel.processor.Traceable;
+import org.apache.camel.processor.interceptor.TraceEventHandler;
+import org.apache.camel.processor.interceptor.TraceInterceptor;
+import org.apache.camel.processor.interceptor.Tracer;
+import org.apache.camel.util.MessageHelper;
+import org.springframework.jmx.export.notification.NotificationPublisher;
+import org.springframework.jmx.export.notification.NotificationPublisherAware;
+
+public final class JMXNotificationTraceEventHandler implements 
TraceEventHandler, NotificationPublisherAware {
+    private static final int MAX_MESSAGE_LENGTH = 60;
+    private long num;
+    private NotificationPublisher notificationSender;
+    private Tracer tracer;
+
+    public JMXNotificationTraceEventHandler(Tracer tracer) {
+        this.tracer = tracer;
+    }
+
+    @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 && tracer.isJmxTraceNotifications()) {
+            String body = 
MessageHelper.extractBodyForLogging(exchange.getIn(), "", false, 
tracer.getTraceBodySize());
+            
+            if (body == null) {
+                body = "";
+            }
+            String message = body.substring(0, Math.min(body.length(), 
MAX_MESSAGE_LENGTH));
+            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 setNotificationPublisher(NotificationPublisher 
notificationPublisher) {
+        this.notificationSender = notificationPublisher;
+    }
+
+}

Modified: 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java
URL: 
http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java?rev=1180036&r1=1180035&r2=1180036&view=diff
==============================================================================
--- 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java
 (original)
+++ 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java
 Fri Oct  7 13:47:03 2011
@@ -22,19 +22,31 @@ import org.apache.camel.processor.interc
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.util.ObjectHelper;
 import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedNotification;
+import org.springframework.jmx.export.annotation.ManagedNotifications;
 import org.springframework.jmx.export.annotation.ManagedResource;
+import org.springframework.jmx.export.notification.NotificationPublisher;
+import org.springframework.jmx.export.notification.NotificationPublisherAware;
 
 /**
  * @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 NotificationPublisherAware {
     private final CamelContext camelContext;
     private final Tracer tracer;
+    private JMXNotificationTraceEventHandler jmxTraceHandler;
 
     public ManagedTracer(CamelContext camelContext, Tracer tracer) {
         this.camelContext = camelContext;
         this.tracer = tracer;
+        this.jmxTraceHandler = new JMXNotificationTraceEventHandler(tracer);
+        if (this.tracer.getTraceHandler() == null) {
+            this.tracer.setTraceHandler(this.jmxTraceHandler);
+        }
     }
 
     public void init(ManagementStrategy strategy) {
@@ -409,5 +421,30 @@ public class ManagedTracer {
         }
         tracer.getDefaultTraceFormatter().setMaxChars(maxChars);
     }
+    
+    @ManagedAttribute(description = "Should trace events be sent as jmx 
notifications")
+    public boolean isJmxTraceNotifications() {
+        return this.tracer.isJmxTraceNotifications();
+    }
+
+    @ManagedAttribute
+    public void setJmxTraceNotifications(boolean jmxTraceNotifications) {
+        this.tracer.setJmxTraceNotifications(jmxTraceNotifications);
+    }
+
+    @ManagedAttribute(description = "Maximum size of a message body for trace 
notification")
+    public int getTraceBodySize() {
+        return this.tracer.getTraceBodySize();
+    }
+
+    @ManagedAttribute
+    public void setTraceBodySize(int traceBodySize) {
+        this.tracer.setTraceBodySize(traceBodySize);
+    }
+
+    @Override
+    public void setNotificationPublisher(NotificationPublisher 
notificationPublisher) {
+        this.jmxTraceHandler.setNotificationPublisher(notificationPublisher);
+    }
 
 }

Modified: 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
URL: 
http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java?rev=1180036&r1=1180035&r2=1180036&view=diff
==============================================================================
--- 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
 (original)
+++ 
camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
 Fri Oct  7 13:47:03 2011
@@ -54,6 +54,8 @@ public class Tracer implements Intercept
     private TraceInterceptorFactory traceInterceptorFactory = new 
DefaultTraceInterceptorFactory();
     private TraceEventHandler traceHandler;
     private String jpaTraceEventMessageClassName = JPA_TRACE_EVENT_MESSAGE;
+    private boolean jmxTraceNotifications;
+    private int traceBodySize;
 
     /**
      * Creates a new tracer.
@@ -306,6 +308,22 @@ public class Tracer implements Intercept
         this.jpaTraceEventMessageClassName = jpaTraceEventMessageClassName;
     }
 
+    public boolean isJmxTraceNotifications() {
+        return jmxTraceNotifications;
+    }
+
+    public void setJmxTraceNotifications(boolean jmxTraceNotifications) {
+        this.jmxTraceNotifications = jmxTraceNotifications;
+    }
+
+    public int getTraceBodySize() {
+        return traceBodySize;
+    }
+
+    public void setTraceBodySize(int traceBodySize) {
+        this.traceBodySize = traceBodySize;
+    }
+
     @Override
     public String toString() {
         return "Tracer";


Reply via email to