Hi Claus,

I read your mail and wanted to contact you on irc. I must have forgotten about it then. Today Dan reminded me about it. The reason for the pom dependency change was that the spring notification support required an exception class from the spring-core. I see though that this change is not good in a bugfix release.

I have changed the Notification Support from the "spring way" to the Standard JMX way. I think it should now work and I was
able to put the pom into the old state.

Christian

Am 12.10.2011 10:07, schrieb Claus Ibsen:
Christian did you read this? We cannot do a patch release where we
change the dependencies in camel-core.


On Sun, Oct 9, 2011 at 10:10 AM, Claus Ibsen<claus.ib...@gmail.com>  wrote:
Why do you change the dependencies in pom.xml file.
Is that a mistake?


On Fri, Oct 7, 2011 at 3:47 PM,<cschnei...@apache.org>  wrote:
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";





--
Claus Ibsen
-----------------
FuseSource
Email: cib...@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/




--
Christian Schneider
http://www.liquid-reality.de

Open Source Architect
http://www.talend.com

Reply via email to