You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "alberto.zigoni" <al...@gmail.com> on 2011/07/18 09:42:14 UTC

two webapps on Tomcat sharing cache through Camel

I have defined a Camel context with a route creating and populating a cache.
This camel context is included into a web application deployed on Tomcat.

The route creating and populating the cache is fired at startup using a Quartz endpoint. Everything works fine.

Now I want to query that cache from another web application deployed to the same Tomcat server (i.e. same JVM for the two webapps), using a dedicated Camel route.

The problem is that the CacheManager instantiated by Camel is a singleton within the scope of the classloader and, since Servlet API reverses the standard classloading hierarchy, the two webapps each create their own CacheManager, so they cannot share the cache.

I am using Camel 2.6.0.

I have found an ugly workaround, which is to delete all the jars from the WEB-INF/lib directories and copy them into Tomcat lib directory.

Another workaround that I am trying is to query the cache through a vm: endpoint from one Camel context to the other, like this:

Context A:

from("wherever").to("vm:queryCache")


Context B:

from("vm:queryCache").to("cache://myCache")

Can you suggest other ways of having the webapps sharing the cache?

Is it possible to override Ehcache configuration with camel 2.6.0?

Thanks

Alberto

--
View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598504.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: two webapps on Tomcat sharing cache through Camel

Posted by "alberto.zigoni" <al...@gmail.com>.
Yes,

they are serializable. Everything works fine if everything is used within the same web application. The problems come out when spreading things among different web apps.

Unfortunately I cannot go with OSGi because of backwards compatibility.

Thanks anyway.

Alberto



Il giorno 18/lug/2011, alle ore 10.26, Claus Ibsen-2 [via Camel] ha scritto:

> On Mon, Jul 18, 2011 at 10:21 AM, alberto.zigoni 
> <[hidden email]> wrote:
> 
> > Claus, 
> > 
> > I have tried it first, but there are a lot of ClassNotFoundError problems. 
> > 
> > Even though you find the least amount of jars to be copied to the tomcat shared lib, there are problems when you e.g. call exchange.getIn().getBody(MyApplicationClass.class). 
> > 
> > If the Camel core classes are loaded by a different classloader than the application classes, the getBody returns null even if the body is not null and is of the correct type (verified with the debugger). 
> > 
> > I am thinking about using RMI or something like that. 
> >
> 
> Are the java objects you store in the cache serializable? 
> 
> You can also store the content in the cache in a canonical format such 
> as JSon, XML, binary using google protobuf, any other custom 
> serialization etc. 
> 
> Alternatively this kind of issues is where OSGi excels. It allows 
> these kind of modularization. And a much higher class loader 
> flexibility. 
> 
> 
> > Alberto 
> > 
> > 
> > Il giorno 18/lug/2011, alle ore 10.10, Claus Ibsen-2 [via Camel] ha scritto: 
> > 
> >> Maybe just copy that camel-cache JAR into tomcat shared lib. And then 
> >> keep the other Camel JARs in your WARs. 
> >> 
> >> 
> >> On Mon, Jul 18, 2011 at 9:42 AM, alberto.zigoni 
> >> <[hidden email]> wrote: 
> >> 
> >> > I have defined a Camel context with a route creating and populating a cache. 
> >> > This camel context is included into a web application deployed on Tomcat. 
> >> > 
> >> > The route creating and populating the cache is fired at startup using a Quartz endpoint. Everything works fine. 
> >> > 
> >> > Now I want to query that cache from another web application deployed to the same Tomcat server (i.e. same JVM for the two webapps), using a dedicated Camel route. 
> >> > 
> >> > The problem is that the CacheManager instantiated by Camel is a singleton within the scope of the classloader and, since Servlet API reverses the standard classloading hierarchy, the two webapps each create their own CacheManager, so they cannot share the cache. 
> >> > 
> >> > I am using Camel 2.6.0. 
> >> > 
> >> > I have found an ugly workaround, which is to delete all the jars from the WEB-INF/lib directories and copy them into Tomcat lib directory. 
> >> > 
> >> > Another workaround that I am trying is to query the cache through a vm: endpoint from one Camel context to the other, like this: 
> >> > 
> >> > Context A: 
> >> > 
> >> > from("wherever").to("vm:queryCache") 
> >> > 
> >> > 
> >> > Context B: 
> >> > 
> >> > from("vm:queryCache").to("cache://myCache") 
> >> > 
> >> > Can you suggest other ways of having the webapps sharing the cache? 
> >> > 
> >> > Is it possible to override Ehcache configuration with camel 2.6.0? 
> >> > 
> >> > Thanks 
> >> > 
> >> > Alberto 
> >> > 
> >> > -- 
> >> > View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598504.html
> >> > Sent from the Camel - Users mailing list archive at Nabble.com. 
> >> 
> >> 
> >> 
> >> -- 
> >> Claus Ibsen 
> >> ----------------- 
> >> FuseSource 
> >> Email: [hidden email] 
> >> Web: http://fusesource.com
> >> Twitter: davsclaus, fusenews 
> >> Blog: http://davsclaus.blogspot.com/
> >> Author of Camel in Action: http://www.manning.com/ibsen/
> >> 
> >> 
> >> If you reply to this email, your message will be added to the discussion below: 
> >> http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598564.html
> >> To start a new topic under Camel - Users, email [hidden email] 
> >> To unsubscribe from Camel - Users, click here. 
> > 
> > 
> > 
> > -- 
> > View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598591.html
> > Sent from the Camel - Users mailing list archive at Nabble.com.
> 
> 
> 
> -- 
> Claus Ibsen 
> ----------------- 
> FuseSource 
> Email: [hidden email] 
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews 
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/
> 
> 
> If you reply to this email, your message will be added to the discussion below:
> http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598605.html
> To start a new topic under Camel - Users, email ml-node+465428-1832908794-4818@n5.nabble.com 
> To unsubscribe from Camel - Users, click here.



--
View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598774.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: two webapps on Tomcat sharing cache through Camel

Posted by Claus Ibsen <cl...@gmail.com>.
On Mon, Jul 18, 2011 at 10:21 AM, alberto.zigoni
<al...@gmail.com> wrote:
> Claus,
>
> I have tried it first, but there are a lot of ClassNotFoundError problems.
>
> Even though you find the least amount of jars to be copied to the tomcat shared lib, there are problems when you e.g. call exchange.getIn().getBody(MyApplicationClass.class).
>
> If the Camel core classes are loaded by a different classloader than the application classes, the getBody returns null even if the body is not null and is of the correct type (verified with the debugger).
>
> I am thinking about using RMI or something like that.
>

Are the java objects you store in the cache serializable?

You can also store the content in the cache in a canonical format such
as JSon, XML, binary using google protobuf, any other custom
serialization etc.

Alternatively this kind of issues is where OSGi excels. It allows
these kind of modularization. And a much higher class loader
flexibility.


> Alberto
>
>
> Il giorno 18/lug/2011, alle ore 10.10, Claus Ibsen-2 [via Camel] ha scritto:
>
>> Maybe just copy that camel-cache JAR into tomcat shared lib. And then
>> keep the other Camel JARs in your WARs.
>>
>>
>> On Mon, Jul 18, 2011 at 9:42 AM, alberto.zigoni
>> <[hidden email]> wrote:
>>
>> > I have defined a Camel context with a route creating and populating a cache.
>> > This camel context is included into a web application deployed on Tomcat.
>> >
>> > The route creating and populating the cache is fired at startup using a Quartz endpoint. Everything works fine.
>> >
>> > Now I want to query that cache from another web application deployed to the same Tomcat server (i.e. same JVM for the two webapps), using a dedicated Camel route.
>> >
>> > The problem is that the CacheManager instantiated by Camel is a singleton within the scope of the classloader and, since Servlet API reverses the standard classloading hierarchy, the two webapps each create their own CacheManager, so they cannot share the cache.
>> >
>> > I am using Camel 2.6.0.
>> >
>> > I have found an ugly workaround, which is to delete all the jars from the WEB-INF/lib directories and copy them into Tomcat lib directory.
>> >
>> > Another workaround that I am trying is to query the cache through a vm: endpoint from one Camel context to the other, like this:
>> >
>> > Context A:
>> >
>> > from("wherever").to("vm:queryCache")
>> >
>> >
>> > Context B:
>> >
>> > from("vm:queryCache").to("cache://myCache")
>> >
>> > Can you suggest other ways of having the webapps sharing the cache?
>> >
>> > Is it possible to override Ehcache configuration with camel 2.6.0?
>> >
>> > Thanks
>> >
>> > Alberto
>> >
>> > --
>> > View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598504.html
>> > Sent from the Camel - Users mailing list archive at Nabble.com.
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> FuseSource
>> Email: [hidden email]
>> Web: http://fusesource.com
>> Twitter: davsclaus, fusenews
>> Blog: http://davsclaus.blogspot.com/
>> Author of Camel in Action: http://www.manning.com/ibsen/
>>
>>
>> If you reply to this email, your message will be added to the discussion below:
>> http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598564.html
>> To start a new topic under Camel - Users, email ml-node+465428-1832908794-4818@n5.nabble.com
>> To unsubscribe from Camel - Users, click here.
>
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598591.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



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

Re: two webapps on Tomcat sharing cache through Camel

Posted by "alberto.zigoni" <al...@gmail.com>.
Claus,

I have tried it first, but there are a lot of ClassNotFoundError problems.

Even though you find the least amount of jars to be copied to the tomcat shared lib, there are problems when you e.g. call exchange.getIn().getBody(MyApplicationClass.class).

If the Camel core classes are loaded by a different classloader than the application classes, the getBody returns null even if the body is not null and is of the correct type (verified with the debugger).

I am thinking about using RMI or something like that.

Alberto


Il giorno 18/lug/2011, alle ore 10.10, Claus Ibsen-2 [via Camel] ha scritto:

> Maybe just copy that camel-cache JAR into tomcat shared lib. And then 
> keep the other Camel JARs in your WARs. 
> 
> 
> On Mon, Jul 18, 2011 at 9:42 AM, alberto.zigoni 
> <[hidden email]> wrote:
> 
> > I have defined a Camel context with a route creating and populating a cache. 
> > This camel context is included into a web application deployed on Tomcat. 
> > 
> > The route creating and populating the cache is fired at startup using a Quartz endpoint. Everything works fine. 
> > 
> > Now I want to query that cache from another web application deployed to the same Tomcat server (i.e. same JVM for the two webapps), using a dedicated Camel route. 
> > 
> > The problem is that the CacheManager instantiated by Camel is a singleton within the scope of the classloader and, since Servlet API reverses the standard classloading hierarchy, the two webapps each create their own CacheManager, so they cannot share the cache. 
> > 
> > I am using Camel 2.6.0. 
> > 
> > I have found an ugly workaround, which is to delete all the jars from the WEB-INF/lib directories and copy them into Tomcat lib directory. 
> > 
> > Another workaround that I am trying is to query the cache through a vm: endpoint from one Camel context to the other, like this: 
> > 
> > Context A: 
> > 
> > from("wherever").to("vm:queryCache") 
> > 
> > 
> > Context B: 
> > 
> > from("vm:queryCache").to("cache://myCache") 
> > 
> > Can you suggest other ways of having the webapps sharing the cache? 
> > 
> > Is it possible to override Ehcache configuration with camel 2.6.0? 
> > 
> > Thanks 
> > 
> > Alberto 
> > 
> > -- 
> > View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598504.html
> > Sent from the Camel - Users mailing list archive at Nabble.com.
> 
> 
> 
> -- 
> Claus Ibsen 
> ----------------- 
> FuseSource 
> Email: [hidden email] 
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews 
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/
> 
> 
> If you reply to this email, your message will be added to the discussion below:
> http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598564.html
> To start a new topic under Camel - Users, email ml-node+465428-1832908794-4818@n5.nabble.com 
> To unsubscribe from Camel - Users, click here.



--
View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598591.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: two webapps on Tomcat sharing cache through Camel

Posted by Claus Ibsen <cl...@gmail.com>.
Maybe just copy that camel-cache JAR into tomcat shared lib. And then
keep the other Camel JARs in your WARs.


On Mon, Jul 18, 2011 at 9:42 AM, alberto.zigoni
<al...@gmail.com> wrote:
> I have defined a Camel context with a route creating and populating a cache.
> This camel context is included into a web application deployed on Tomcat.
>
> The route creating and populating the cache is fired at startup using a Quartz endpoint. Everything works fine.
>
> Now I want to query that cache from another web application deployed to the same Tomcat server (i.e. same JVM for the two webapps), using a dedicated Camel route.
>
> The problem is that the CacheManager instantiated by Camel is a singleton within the scope of the classloader and, since Servlet API reverses the standard classloading hierarchy, the two webapps each create their own CacheManager, so they cannot share the cache.
>
> I am using Camel 2.6.0.
>
> I have found an ugly workaround, which is to delete all the jars from the WEB-INF/lib directories and copy them into Tomcat lib directory.
>
> Another workaround that I am trying is to query the cache through a vm: endpoint from one Camel context to the other, like this:
>
> Context A:
>
> from("wherever").to("vm:queryCache")
>
>
> Context B:
>
> from("vm:queryCache").to("cache://myCache")
>
> Can you suggest other ways of having the webapps sharing the cache?
>
> Is it possible to override Ehcache configuration with camel 2.6.0?
>
> Thanks
>
> Alberto
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/two-webapps-on-Tomcat-sharing-cache-through-Camel-tp4598504p4598504.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



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