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 2011/12/06 08:42:33 UTC
svn commit: r1210808 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/api/management/mbean/
camel-core/src/main/java/org/apache/camel/component/
components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/
components/cam...
Author: davsclaus
Date: Tue Dec 6 07:42:33 2011
New Revision: 1210808
URL: http://svn.apache.org/viewvc?rev=1210808&view=rev
Log:
CAMEL-4669: Added JMX opertions to clear content cache on ResourceEndpoint. Thanks to Rich Newcomb for the patch.
Added:
camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java
camel/trunk/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
camel/trunk/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerContentCacheTest.java
camel/trunk/components/camel-stringtemplate/src/test/java/org/apache/camel/component/stringtemplate/StringTemplateContentCacheTest.java
camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityContentCacheTest.java
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java?rev=1210808&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java Tue Dec 6 07:42:33 2011
@@ -0,0 +1,33 @@
+/**
+ * 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.api.management.mbean;
+
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedOperation;
+
+public interface ManagedResourceEndpointMBean {
+
+ @ManagedAttribute(description = "Whether the content is cached")
+ boolean isContentCache();
+
+ @ManagedAttribute(description = "Whether the content is cached")
+ void setContentCache(boolean contentCache);
+
+ @ManagedOperation(description = "Clears the content cache")
+ void clearContentCache();
+
+}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java?rev=1210808&r1=1210807&r2=1210808&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java Tue Dec 6 07:42:33 2011
@@ -21,6 +21,8 @@ import java.io.IOException;
import java.io.InputStream;
import org.apache.camel.Component;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.mbean.ManagedResourceEndpointMBean;
import org.apache.camel.converter.IOConverter;
import org.apache.camel.impl.ProcessorEndpoint;
import org.apache.camel.util.IOHelper;
@@ -32,11 +34,12 @@ import org.slf4j.LoggerFactory;
* A useful base class for endpoints which depend on a resource
* such as things like Velocity or XQuery based components.
*/
-public abstract class ResourceEndpoint extends ProcessorEndpoint {
+@ManagedResource(description = "Managed ResourceEndpoint")
+public abstract class ResourceEndpoint extends ProcessorEndpoint implements ManagedResourceEndpointMBean {
protected final transient Logger log = LoggerFactory.getLogger(getClass());
private String resourceUri;
private boolean contentCache;
- private byte[] buffer;
+ private volatile byte[] buffer;
public ResourceEndpoint() {
}
@@ -58,7 +61,7 @@ public abstract class ResourceEndpoint e
public InputStream getResourceAsInputStream() throws IOException {
// try to get the resource input stream
InputStream is;
- if (contentCache) {
+ if (isContentCache()) {
synchronized (this) {
if (buffer == null) {
log.debug("Reading resource: {} into the content cache", resourceUri);
@@ -92,6 +95,11 @@ public abstract class ResourceEndpoint e
public boolean isContentCache() {
return contentCache;
}
+
+ public synchronized void clearContentCache() {
+ log.debug("Clearing resource: {} from the content cache", resourceUri);
+ buffer = null;
+ }
/**
* Sets whether to use resource content cache or not - default is <tt>false</tt>.
Modified: camel/trunk/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java?rev=1210808&r1=1210807&r2=1210808&view=diff
==============================================================================
--- camel/trunk/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java (original)
+++ camel/trunk/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java Tue Dec 6 07:42:33 2011
@@ -89,6 +89,11 @@ public class FreemarkerEndpoint extends
log.debug("Getting endpoint with URI: {}", newUri);
return (FreemarkerEndpoint) getCamelContext().getEndpoint(newUri);
}
+
+ @Override
+ public void clearContentCache() {
+ configuration.clearTemplateCache();
+ }
@Override
@SuppressWarnings("unchecked")
Modified: camel/trunk/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerContentCacheTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerContentCacheTest.java?rev=1210808&r1=1210807&r2=1210808&view=diff
==============================================================================
--- camel/trunk/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerContentCacheTest.java (original)
+++ camel/trunk/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerContentCacheTest.java Tue Dec 6 07:42:33 2011
@@ -16,6 +16,12 @@
*/
package org.apache.camel.component.freemarker;
+import java.util.ArrayList;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
@@ -27,6 +33,11 @@ import org.junit.Test;
* Unit test the cache when reloading .ftl files in the classpath
*/
public class FreemarkerContentCacheTest extends CamelTestSupport {
+
+ @Override
+ public boolean useJmx() {
+ return true;
+ }
@Before
public void setUp() throws Exception {
@@ -102,6 +113,46 @@ public class FreemarkerContentCacheTest
mock.assertIsSatisfied();
}
+ @Test
+ public void testClearCacheViaJmx() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Hello London");
+
+ template.sendBodyAndHeader("direct:b", "Body", "name", "London");
+ mock.assertIsSatisfied();
+
+ // now change content in the file in the classpath and try again
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/freemarker?fileExist=Override", "Bye ${headers.name}", Exchange.FILE_NAME, "hello.ftl");
+
+ mock.reset();
+ // we must expected the original filecontent as the cache is enabled, so its Hello and not Bye
+ mock.expectedBodiesReceived("Hello Paris");
+
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+
+ // clear the cache via the mbean server
+ MBeanServer mbeanServer = context.getManagementStrategy().getManagementAgent().getMBeanServer();
+ Set<ObjectName> objNameSet = mbeanServer.queryNames(new ObjectName("org.apache.camel:type=endpoints,name=\"freemarker:*contentCache=true*\",*"), null);
+ ObjectName managedObjName = new ArrayList<ObjectName>(objNameSet).get(0);
+ mbeanServer.invoke(managedObjName, "clearContentCache", null, null);
+
+ // change content in the file in the classpath and try again
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/freemarker?fileExist=Override", "Bye ${headers.name}", Exchange.FILE_NAME, "hello.ftl");
+ mock.reset();
+ // we expect the updated file content because the cache was cleared
+ mock.expectedBodiesReceived("Bye Paris");
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+
+ // change content in the file in the classpath and try again to verify that the caching is still in effect after clearing the cache
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/freemarker?fileExist=Override", "Hello ${headers.name}", Exchange.FILE_NAME, "hello.ftl");
+ mock.reset();
+ // we expect the cached content from the prior update
+ mock.expectedBodiesReceived("Bye Paris");
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+ }
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
Modified: camel/trunk/components/camel-stringtemplate/src/test/java/org/apache/camel/component/stringtemplate/StringTemplateContentCacheTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stringtemplate/src/test/java/org/apache/camel/component/stringtemplate/StringTemplateContentCacheTest.java?rev=1210808&r1=1210807&r2=1210808&view=diff
==============================================================================
--- camel/trunk/components/camel-stringtemplate/src/test/java/org/apache/camel/component/stringtemplate/StringTemplateContentCacheTest.java (original)
+++ camel/trunk/components/camel-stringtemplate/src/test/java/org/apache/camel/component/stringtemplate/StringTemplateContentCacheTest.java Tue Dec 6 07:42:33 2011
@@ -16,6 +16,12 @@
*/
package org.apache.camel.component.stringtemplate;
+import java.util.ArrayList;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
@@ -35,6 +41,11 @@ public class StringTemplateContentCacheT
// create a tm file in the classpath as this is the tricky reloading stuff
template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/stringtemplate?fileExist=Override", "Hello $headers.name$", Exchange.FILE_NAME, "hello.tm");
}
+
+ @Override
+ public boolean useJmx() {
+ return true;
+ }
@Test
public void testNotCached() throws Exception {
@@ -72,6 +83,45 @@ public class StringTemplateContentCacheT
template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
mock.assertIsSatisfied();
}
+
+ @Test
+ public void testClearCacheViaJmx() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Hello London");
+
+ template.sendBodyAndHeader("direct:b", "Body", "name", "London");
+ mock.assertIsSatisfied();
+
+ // now change content in the file in the classpath and try again
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/stringtemplate?fileExist=Override", "Bye $headers.name$", Exchange.FILE_NAME, "hello.tm");
+
+ mock.reset();
+ // we must expected the original filecontent as the cache is enabled, so its Hello and not Bye
+ mock.expectedBodiesReceived("Hello Paris");
+
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+
+ // clear the cache using jmx
+ MBeanServer mbeanServer = context.getManagementStrategy().getManagementAgent().getMBeanServer();
+ Set<ObjectName> objNameSet = mbeanServer.queryNames(new ObjectName("org.apache.camel:type=endpoints,name=\"string-template:*contentCache=true*\",*"), null);
+ ObjectName managedObjName = new ArrayList<ObjectName>(objNameSet).get(0);
+ mbeanServer.invoke(managedObjName, "clearContentCache", null, null);
+
+ mock.reset();
+ // we expect that the new resource will be set as the cached value, since the cache has been cleared
+ mock.expectedBodiesReceived("Bye Paris");
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/stringtemplate?fileExist=Override", "Bye $headers.name$", Exchange.FILE_NAME, "hello.tm");
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+
+ mock.reset();
+ // we expect that the cached value will not be replaced by a different resource since the cache is now re-established
+ mock.expectedBodiesReceived("Bye Paris");
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/stringtemplate?fileExist=Override", "Hello $headers.name$", Exchange.FILE_NAME, "hello.tm");
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+ }
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
Modified: camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityContentCacheTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityContentCacheTest.java?rev=1210808&r1=1210807&r2=1210808&view=diff
==============================================================================
--- camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityContentCacheTest.java (original)
+++ camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityContentCacheTest.java Tue Dec 6 07:42:33 2011
@@ -16,6 +16,12 @@
*/
package org.apache.camel.component.velocity;
+import java.util.ArrayList;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
@@ -35,6 +41,11 @@ public class VelocityContentCacheTest ex
// create a vm file in the classpath as this is the tricky reloading stuff
template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/velocity?fileExist=Override", "Hello $headers.name", Exchange.FILE_NAME, "hello.vm");
}
+
+ @Override
+ public boolean useJmx() {
+ return true;
+ }
@Test
public void testNotCached() throws Exception {
@@ -91,6 +102,49 @@ public class VelocityContentCacheTest ex
template.sendBodyAndHeader("direct:c", "Body", "name", "Paris");
mock.assertIsSatisfied();
}
+
+ @Test
+ public void testClearCacheViaJmx() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Hello London");
+
+ template.sendBodyAndHeader("direct:b", "Body", "name", "London");
+ mock.assertIsSatisfied();
+
+ // now change content in the file in the classpath and try again
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/velocity?fileExist=Override", "Bye $headers.name", Exchange.FILE_NAME, "hello.vm");
+
+ mock.reset();
+ // we must expected the original filecontent as the cache is enabled, so its Hello and not Bye
+ mock.expectedBodiesReceived("Hello Paris");
+
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+
+ // clear the cache via the mbean server
+ MBeanServer mbeanServer = context.getManagementStrategy().getManagementAgent().getMBeanServer();
+ Set<ObjectName> objNameSet = mbeanServer.queryNames(new ObjectName("org.apache.camel:type=endpoints,name=\"velocity:*contentCache=true*\",*"), null);
+ ObjectName managedObjName = new ArrayList<ObjectName>(objNameSet).get(0);
+ mbeanServer.invoke(managedObjName, "clearContentCache", null, null);
+
+ // now change content in the file in the classpath
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/velocity?fileExist=Override", "Bye $headers.name", Exchange.FILE_NAME, "hello.vm");
+
+ mock.reset();
+ // we expect the update to work now since the cache has been cleared
+ mock.expectedBodiesReceived("Bye Paris");
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+
+ // change the content in the file again
+ template.sendBodyAndHeader("file://target/test-classes/org/apache/camel/component/velocity?fileExist=Override", "Hello $headers.name", Exchange.FILE_NAME, "hello.vm");
+ mock.reset();
+ // we expect the new value to be ignored since the cache was re-established with the prior exchange
+ mock.expectedBodiesReceived("Bye Paris");
+ template.sendBodyAndHeader("direct:b", "Body", "name", "Paris");
+ mock.assertIsSatisfied();
+ }
+
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {