L.S., I just raised https://issues.apache.org/jira/browse/CAMEL-4147 to keep track of this request.
Regards, Gert Vanthienen ------------------------ FuseSource Web: http://fusesource.com Blog: http://gertvanthienen.blogspot.com/ On Tue, Jun 21, 2011 at 10:09 PM, Donald Whytock <[email protected]> wrote: > Not familiar with OSGi Declarative Services, so there will be some > guesswork on my part... > > Yes, I use OsgiCamelTracker to control the Camel-using bundles. But > it also tracks whether the CamelContext-singleton-providing service > (ContextUtil) is up. That service in turn depends on an instance of > org.apache.camel.spi.TypeConverterLoader service. > > camel-core has a BundleActivator. That activator starts a > BundleTracker that checks every bundle that launches (including > itself) to see if it contains components that need to be loaded. It > registers the components as services first, then it registers > TypeConverterLoader. > > From the example you gave, it looks like you need to create another > class that binds to TypeConverterLoader, generates and starts a > CamelContext, and then registers itself as a service; then your > CamelStarter class would bind to that service along with the > ComponentResolver(s), and fetch the CamelContext from that service. > > Can you bind to multiple services via your XML, such that your class > won't activate until all the other services are found? > > Don > > On Tue, Jun 21, 2011 at 3:21 PM, Michael Furtak <[email protected]> wrote: >> Hi Don, >> >> I reviewed your sample code. Thanks very much for sharing that with me. If I >> understand the intent and explanation correctly, you are using your >> OsgiCamelTracker to delay the start-up of your Camel-using code until you >> can be sure that the requisite ComponentResolver services have become >> available. >> >> In my current project we use OSGi Declarative Services, so I have set up an >> OSGi component (yay, overloaded terms!) that requests a service reference >> for a ComponentResolver that can provide the Camel 'file' component. This >> should have the same effect of delaying the activation of my CamelStarter >> class until that service can be bound. Here's the DS xml: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" >> name="com.cra.camelsandbox.CamelStarter"> >> <implementation class="com.cra.camelsandbox.CamelStarter"/> >> <reference bind="bindComponentResolver" cardinality="1..1" >> interface="org.apache.camel.spi.ComponentResolver" name="ComponentResolver" >> policy="dynamic" target="(component=file)" unbind="unbindComponentResolver"/> >> </scr:component> >> >> >> And the Java class itself: >> >> public class CamelStarter >> { >> private static final transient Logger LOG = >> LoggerFactory.getLogger(CamelStarter.class); >> >> protected void activate(ComponentContext context) throws Exception >> { >> LOG.trace("activating"); >> CamelContext camelContext = new >> OsgiDefaultCamelContext(context.getBundleContext()); >> // camelContext.start(); >> } >> >> protected void deactivate(ComponentContext context) >> { >> LOG.trace("deactivating"); >> } >> >> protected void bindComponentResolver(ComponentResolver cr) >> { >> LOG.trace("Binding ComponentResolver"); >> // Ignored, since the ComponentResolver is not directly used >> } >> >> protected void unbindComponentResolver(ComponentResolver cr) >> { >> LOG.trace("Unbinding ComponentResolver"); >> // Ignored, since the ComponentResolver is not directly used >> } >> } >> >> With the third line of the activate method commented out, everything seems >> to go as planned: >> >> [21 Jun 2011 15:08:19] TRACE [Component Resolve Thread (Bundle 12)] >> CamelStarter - Binding ComponentResolver >> [21 Jun 2011 15:08:19] TRACE [Component Resolve Thread (Bundle 12)] >> CamelStarter - activating >> >> >> But if I uncomment it, I get this: >> >> java.lang.reflect.InvocationTargetException >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> at java.lang.reflect.Method.invoke(Method.java:597) >> at >> org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:210) >> at >> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:139) >> at >> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:339) >> at >> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588) >> at >> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196) >> at >> org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441) >> at >> org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213) >> at >> org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800) >> at >> org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767) >> at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89) >> at >> org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70) >> Caused by: org.apache.camel.RuntimeCamelException: Error staring >> OSGiTypeConverter due: Failed to load type converters because of: Cannot >> find any type converter classes from the following packages: >> [org.apache.camel.component.file, org.apache.camel.component.bean, >> org.apache.camel.converter] >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.createRegistry(OsgiTypeConverter.java:206) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.getDelegate(OsgiTypeConverter.java:164) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.addingService(OsgiTypeConverter.java:69) >> at >> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:896) >> at >> org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:261) >> at >> org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:184) >> at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:339) >> at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.doStart(OsgiTypeConverter.java:102) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >> at >> org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) >> at >> org.apache.camel.impl.DefaultCamelContext.startServices(DefaultCamelContext.java:1613) >> at >> org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:899) >> at >> org.apache.camel.impl.DefaultCamelContext.getTypeConverter(DefaultCamelContext.java:984) >> at >> org.apache.camel.impl.DefaultCamelContext.getTypeConverterRegistry(DefaultCamelContext.java:1001) >> at >> org.apache.camel.impl.DefaultCamelContext.forceLazyInitialization(DefaultCamelContext.java:1940) >> at >> org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1423) >> at >> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1336) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >> at >> org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1314) >> at com.cra.camelsandbox.CamelStarter.activate(CamelStarter.java:18) >> ... 15 more >> Caused by: org.apache.camel.TypeConverterLoaderException: Failed to load >> type converters because of: Cannot find any type converter classes from the >> following packages: [org.apache.camel.component.file, >> org.apache.camel.component.bean, org.apache.camel.converter] >> at >> org.apache.camel.impl.converter.AnnotationTypeConverterLoader.load(AnnotationTypeConverterLoader.java:79) >> at >> org.apache.camel.impl.converter.BaseTypeConverterRegistry.loadTypeConverters(BaseTypeConverterRegistry.java:395) >> at >> org.apache.camel.impl.converter.DefaultTypeConverter.doStart(DefaultTypeConverter.java:41) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >> at >> org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.createRegistry(OsgiTypeConverter.java:202) >> ... 37 more >> Root exception: >> org.apache.camel.RuntimeCamelException: Error staring OSGiTypeConverter due: >> Failed to load type converters because of: Cannot find any type converter >> classes from the following packages: [org.apache.camel.component.file, >> org.apache.camel.component.bean, org.apache.camel.converter] >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.createRegistry(OsgiTypeConverter.java:206) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.getDelegate(OsgiTypeConverter.java:164) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.addingService(OsgiTypeConverter.java:69) >> at >> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:896) >> at >> org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:261) >> at >> org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:184) >> at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:339) >> at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.doStart(OsgiTypeConverter.java:102) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >> at >> org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) >> at >> org.apache.camel.impl.DefaultCamelContext.startServices(DefaultCamelContext.java:1613) >> at >> org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:899) >> at >> org.apache.camel.impl.DefaultCamelContext.getTypeConverter(DefaultCamelContext.java:984) >> at >> org.apache.camel.impl.DefaultCamelContext.getTypeConverterRegistry(DefaultCamelContext.java:1001) >> at >> org.apache.camel.impl.DefaultCamelContext.forceLazyInitialization(DefaultCamelContext.java:1940) >> at >> org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1423) >> at >> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1336) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >> at >> org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1314) >> at com.cra.camelsandbox.CamelStarter.activate(CamelStarter.java:18) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> at java.lang.reflect.Method.invoke(Method.java:597) >> at >> org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:210) >> at >> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:139) >> at >> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:339) >> at >> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588) >> at >> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196) >> at >> org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441) >> at >> org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213) >> at >> org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800) >> at >> org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767) >> at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89) >> at >> org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70) >> Caused by: org.apache.camel.TypeConverterLoaderException: Failed to load >> type converters because of: Cannot find any type converter classes from the >> following packages: [org.apache.camel.component.file, >> org.apache.camel.component.bean, org.apache.camel.converter] >> at >> org.apache.camel.impl.converter.AnnotationTypeConverterLoader.load(AnnotationTypeConverterLoader.java:79) >> at >> org.apache.camel.impl.converter.BaseTypeConverterRegistry.loadTypeConverters(BaseTypeConverterRegistry.java:395) >> at >> org.apache.camel.impl.converter.DefaultTypeConverter.doStart(DefaultTypeConverter.java:41) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:67) >> at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:54) >> at >> org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) >> at >> org.apache.camel.core.osgi.OsgiTypeConverter.createRegistry(OsgiTypeConverter.java:202) >> ... 37 more >> >> Slightly off topic, your advice about needing to share the CamelContext >> object as a singleton (wrt. SEDA, etc.) was received loud and clear. What >> you see here is me just trying to keep my test cases simple for now. >> >> >> So that's where I am stuck at the moment. I'm sorry not to be working more >> directly from your sample code, but please correct me if its service >> management strategy/intent is different from my understanding. Does my >> current problem make sense? What am I missing? >> >> >> Thanks, >> -Mike >> >> >> >> >> >> >> >> >> THIS MESSAGE IS INTENDED FOR THE USE OF THE PERSON TO WHOM IT IS ADDRESSED. >> IT MAY CONTAIN INFORMATION THAT IS PRIVILEGED, CONFIDENTIAL AND EXEMPT FROM >> DISCLOSURE UNDER APPLICABLE LAW. If you are not the intended recipient, your >> use of this message for any purpose is strictly prohibited. If you have >> received this communication in error, please delete the message and notify >> the sender so that we may correct our records. >> >> -----Original Message----- >> >> >> >> From: Donald Whytock [mailto:[email protected]] >> Sent: Monday, June 20, 2011 4:45 PM >> To: [email protected] >> Subject: Re: Camel under OSGi without Spring et al. >> >> OsgiCamelTracker.java (attached) is a work in progress. There's a >> reference to ContextUtil; that's the service class that supplies the >> CamelContext singleton. >> >> Use it by subclassing it and implementing methods start() and stop(). >> Call setBundleContext(bundleContext) first, then startTracking(). >> >> OsgiCamelTracker.startTracking() accepts no parameters, a single >> String, or a Collection<String>. The strings are the names of >> components that you need. It'll track instances of ComponentResolver, >> maintaining a list of what components are available and what >> components are still needed. When all the components you need are >> available, it'll call start(); when any of the components cease to be >> available, it'll call stop(). >> >> If you don't supply component names, it'll react to camel-core itself >> becoming active, which is all you need for core components like mock, >> bean and file. >> >> Use routeId(<name>) in your route definitions. Use >> camelcontext.startRoute(<name>) from the OsgiCamelTracker.start(); use >> camelcontext.stopRoute(<name>) from the OsgiCamelTracker.stop(). >> >> Be advised, you'll need to use a singleton CamelContext if you're >> using SEDA queues, because SEDA queues are local to a CamelContext >> instance. A route that consumes from a SEDA queue from one >> CamelContext instance won't see anything produced to a SEDA queue from >> a different CamelContext instance. >> >> For OsgiDefaultCamelContext... >> >>> On Mon, Jun 20, 2011 at 3:31 PM, Michael Furtak <[email protected]> wrote: >>>> I did come across mention of this in my troubleshooting exploration. It >>>> seems to be part of a bundle called camel-core-osgi, is that right? I >>>> don't think I have it in my 2.7.2 distribution. Is it something I need to >>>> bundle myself? I also saw mention of it being private to the Spring >>>> bundle, which is what prompted my discussion about not wanting to bring in >>>> Spring. >> >> org.apache.camel.core.osgi is in camel-blueprint.jar. I split it out >> into its own .jar so as to not worry about the Blueprint dependencies. >> You'll need to modify the manifest, or make your own. >> >> Don >> >> >
