You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/03/19 13:55:38 UTC

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

Author: davsclaus
Date: Tue Mar 19 12:55:38 2013
New Revision: 1458259

URL: http://svn.apache.org/r1458259
Log:
CAMEL-6148: More options on BacklogTracer

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java Tue Mar 19 12:55:38 2013
@@ -35,6 +35,12 @@ public interface ManagedTracerBacklogMBe
     @ManagedAttribute(description = "Number of traced messages to keep in the backlog (FIFO queue)")
     void setBacklogSize(int backlogSize);
 
+    @ManagedAttribute(description = "Whether to remove traced message from backlog when dumping trace messages")
+    boolean isRemoveOnDump();
+
+    @ManagedAttribute(description = "Whether to remove traced message from backlog when dumping trace messages")
+    void setRemoveOnDump(boolean removeOnDump);
+
     @ManagedAttribute(description = "To filter tracing by nodes (pattern)")
     void setTracePattern(String pattern);
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java Tue Mar 19 12:55:38 2013
@@ -70,6 +70,14 @@ public class ManagedBacklogTracer implem
         backlogTracer.setBacklogSize(backlogSize);
     }
 
+    public boolean isRemoveOnDump() {
+        return backlogTracer.isRemoveOnDump();
+    }
+
+    public void setRemoveOnDump(boolean removeOnDump) {
+        backlogTracer.setRemoveOnDump(removeOnDump);
+    }
+
     public void setTracePattern(String pattern) {
         backlogTracer.setTracePattern(pattern);
     }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java Tue Mar 19 12:55:38 2013
@@ -44,13 +44,16 @@ import org.apache.camel.util.EndpointHel
  */
 public class BacklogTracer extends ServiceSupport implements InterceptStrategy {
 
+    // lets limit the tracer to 1000 messages per node
+    public static final int MAX_BACKLOG_SIZE = 1000;
     private final CamelContext camelContext;
     private boolean enabled;
     private final AtomicLong traceCounter = new AtomicLong(0);
     // use a queue with a upper limit to avoid storing too many messages
-    private final Queue<DefaultBacklogTracerEventMessage> queue = new ArrayBlockingQueue<DefaultBacklogTracerEventMessage>(1000);
+    private final Queue<DefaultBacklogTracerEventMessage> queue = new ArrayBlockingQueue<DefaultBacklogTracerEventMessage>(MAX_BACKLOG_SIZE);
     // how many of the last messages per node to keep in the backlog
-    private int backlogSize = 10;
+    private int backlogSize = MAX_BACKLOG_SIZE;
+    private boolean removeOnDump = true;
     // a pattern to filter tracing nodes
     private String tracePattern;
     private String[] patterns;
@@ -154,9 +157,20 @@ public class BacklogTracer extends Servi
         if (backlogSize <= 0) {
             throw new IllegalArgumentException("The backlog size must be a positive number, was: " + backlogSize);
         }
+        if (backlogSize > MAX_BACKLOG_SIZE) {
+            throw new IllegalArgumentException("The backlog size cannot be greater than the max size of " + MAX_BACKLOG_SIZE + ", was: " + backlogSize);
+        }
         this.backlogSize = backlogSize;
     }
 
+    public boolean isRemoveOnDump() {
+        return removeOnDump;
+    }
+
+    public void setRemoveOnDump(boolean removeOnDump) {
+        this.removeOnDump = removeOnDump;
+    }
+
     public String getTracePattern() {
         return tracePattern;
     }
@@ -188,6 +202,11 @@ public class BacklogTracer extends Servi
                 }
             }
         }
+
+        if (removeOnDump) {
+            queue.removeAll(answer);
+        }
+
         return answer;
     }
 
@@ -206,7 +225,9 @@ public class BacklogTracer extends Servi
     public List<BacklogTracerEventMessage> dumpAllTracedMessages() {
         List<BacklogTracerEventMessage> answer = new ArrayList<BacklogTracerEventMessage>();
         answer.addAll(queue);
-        queue.clear();
+        if (isRemoveOnDump()) {
+            queue.clear();
+        }
         return answer;
     }
 

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java Tue Mar 19 12:55:38 2013
@@ -44,7 +44,7 @@ public class BacklogTracerIdOnAllNodesTe
         assertEquals("Should not be enabled", Boolean.FALSE, enabled);
 
         Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize");
-        assertEquals("Should be 10", 10, size.intValue());
+        assertEquals("Should be 1000", 1000, size.intValue());
 
         // enable it
         mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE));

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java Tue Mar 19 12:55:38 2013
@@ -37,7 +37,7 @@ public class BacklogTracerPatternRouteTe
         assertEquals("Should not be enabled", Boolean.FALSE, enabled);
 
         Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize");
-        assertEquals("Should be 10", 10, size.intValue());
+        assertEquals("Should be 1000", 1000, size.intValue());
 
         // set the pattern to match only coolRoute
         mbeanServer.setAttribute(on, new Attribute("TracePattern", "coolRoute"));

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java Tue Mar 19 12:55:38 2013
@@ -38,7 +38,7 @@ public class BacklogTracerPatternTest ex
         assertEquals("Should not be enabled", Boolean.FALSE, enabled);
 
         Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize");
-        assertEquals("Should be 10", 10, size.intValue());
+        assertEquals("Should be 1000", 1000, size.intValue());
 
         // set the pattern to match only foo*
         mbeanServer.setAttribute(on, new Attribute("TracePattern", "foo*"));

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java?rev=1458259&r1=1458258&r2=1458259&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java Tue Mar 19 12:55:38 2013
@@ -41,7 +41,10 @@ public class BacklogTracerTest extends M
         assertEquals("Should not be enabled", Boolean.FALSE, enabled);
 
         Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize");
-        assertEquals("Should be 10", 10, size.intValue());
+        assertEquals("Should be 1000", 1000, size.intValue());
+
+        Boolean removeOnDump = (Boolean) mbeanServer.getAttribute(on, "RemoveOnDump");
+        assertEquals(Boolean.TRUE, removeOnDump);
 
         // enable it
         mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE));
@@ -86,7 +89,7 @@ public class BacklogTracerTest extends M
         assertEquals("Should not be enabled", Boolean.FALSE, enabled);
 
         Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize");
-        assertEquals("Should be 10", 10, size.intValue());
+        assertEquals("Should be 1000", 1000, size.intValue());
 
         // enable it
         mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE));
@@ -219,6 +222,118 @@ public class BacklogTracerTest extends M
         assertEquals(6, list.getLength());
     }
 
+    @SuppressWarnings("unchecked")
+    public void testBacklogTracerNotRemoveOnDump() throws Exception {
+        MBeanServer mbeanServer = getMBeanServer();
+        ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer");
+        assertNotNull(on);
+        mbeanServer.isRegistered(on);
+
+        Boolean removeOnDump = (Boolean) mbeanServer.getAttribute(on, "RemoveOnDump");
+        assertEquals(Boolean.TRUE, removeOnDump);
+        // disable it
+        mbeanServer.setAttribute(on, new Attribute("RemoveOnDump", Boolean.FALSE));
+
+        Boolean enabled = (Boolean) mbeanServer.getAttribute(on, "Enabled");
+        assertEquals("Should not be enabled", Boolean.FALSE, enabled);
+
+        // enable it
+        mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE));
+
+        getMockEndpoint("mock:foo").expectedMessageCount(2);
+        getMockEndpoint("mock:bar").expectedMessageCount(2);
+
+        template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:start", "Bye World");
+
+        assertMockEndpointsSatisfied();
+
+        List<BacklogTracerEventMessage> events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpAllTracedMessages", null, null);
+
+        assertNotNull(events);
+        assertEquals(6, events.size());
+
+        // and if we get again they are still there
+        events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpAllTracedMessages", null, null);
+        assertNotNull(events);
+        assertEquals(6, events.size());
+
+        // send in another message
+        resetMocks();
+
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hi World");
+
+        assertMockEndpointsSatisfied();
+
+        // and now we should have 3 more messages
+        events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpAllTracedMessages", null, null);
+        assertNotNull(events);
+        assertEquals(9, events.size());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testBacklogTracerNotRemoveOnDumpPattern() throws Exception {
+        MBeanServer mbeanServer = getMBeanServer();
+        ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer");
+        assertNotNull(on);
+        mbeanServer.isRegistered(on);
+
+        Boolean removeOnDump = (Boolean) mbeanServer.getAttribute(on, "RemoveOnDump");
+        assertEquals(Boolean.TRUE, removeOnDump);
+        // disable it
+        mbeanServer.setAttribute(on, new Attribute("RemoveOnDump", Boolean.FALSE));
+
+        Boolean enabled = (Boolean) mbeanServer.getAttribute(on, "Enabled");
+        assertEquals("Should not be enabled", Boolean.FALSE, enabled);
+
+        // enable it
+        mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE));
+
+        getMockEndpoint("mock:foo").expectedMessageCount(2);
+        getMockEndpoint("mock:bar").expectedMessageCount(2);
+
+        template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:start", "Bye World");
+
+        assertMockEndpointsSatisfied();
+
+        List<BacklogTracerEventMessage> events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpTracedMessages",
+                new Object[]{"foo"}, new String[]{"java.lang.String"});
+
+        assertNotNull(events);
+        assertEquals(2, events.size());
+
+        // and if we get again they are still there
+        events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpTracedMessages",
+                new Object[]{"foo"}, new String[]{"java.lang.String"});
+        assertEquals(2, events.size());
+
+        // send in another message
+        resetMocks();
+
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hi World");
+
+        assertMockEndpointsSatisfied();
+
+        // and now we should have 3 more messages
+        events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpTracedMessages",
+                new Object[]{"foo"}, new String[]{"java.lang.String"});
+        assertNotNull(events);
+        assertEquals(3, events.size());
+
+        // and bar should also have 3 traced messages
+        events = (List<BacklogTracerEventMessage>) mbeanServer.invoke(on, "dumpTracedMessages",
+                new Object[]{"bar"}, new String[]{"java.lang.String"});
+        assertNotNull(events);
+        assertEquals(3, events.size());
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {