Seems reasonable, since presumably OsgiPackageScanClassResolver is more made to be used in an OSGI environment than the DefaultPackageScanClassResolver. This might also solve a problem I was having, where OsgiDefaultCamelContext.getComponentNames() was coming up empty.
Can you test with a non-core component as well, such as mail? On Mon, Jun 27, 2011 at 4:21 PM, Michael Furtak <[email protected]> wrote: > Ok. I seem to have found a resolution. Now the question is whether or not it > is appropriate. :) > > Since we seemed to agree that classes are not being found by their > annotations, I tried to backtrace how that was being resolved. Where I wound > up was in > org.apache.camel.core.osgi.OsgiTypeConverter.createRegistry(OsgiTypeConverter.java:166) > > There, it seems to be setting up the DefaultTypeConverter which will be used > as the delegate. It sets it up to use a DefaultPackageScanClassResolver, > which seems to be failing to find anything. If I change: > > protected DefaultTypeConverter createRegistry() { > // base the osgi type converter on the default type converter > DefaultTypeConverter answer = new DefaultTypeConverter(new > DefaultPackageScanClassResolver() { > @Override > public Set<ClassLoader> getClassLoaders() { > // we don't need any classloaders as we use osgi service tracker instead > return Collections.emptySet(); > } > }, injector, factoryFinder); > // ... > > to: > > protected DefaultTypeConverter createRegistry() { > // base the osgi type converter on the default type converter > PackageScanClassResolver resolver = new > OsgiPackageScanClassResolver(bundleContext); > DefaultTypeConverter answer = new DefaultTypeConverter(resolver, injector, > factoryFinder); > > > then I get a successful startup and a working test case: > > from("file:data/inbox").to("file:data/outbox"); > > > Hurrah! So, is this a reasonable fix? Does the code I replaced in > OsgiTypeConverter make sense as written? > > Thanks to all who've helped so far. > > -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 27, 2011 1:56 PM > To: [email protected] > Subject: Re: Camel under OSGi without Spring et al. > > No specific thoughts, no. It's fairly clear you're waiting for > TypeConverterLoader to be registered before you're trying to start the > CamelContext, and (if this is all the code you have loaded) you're not > trying to access a file component. Honestly, I think it should work, > but again I'm not familiar with Declarative Services. > > My startup log file has some lines yours doesn't... > > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Found 13 @Converter classes to load > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: > org.apache.camel.component.file.GenericFileConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.component.bean.BeanConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.CamelConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: > org.apache.camel.converter.CollectionConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.IOConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.NIOConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.ObjectConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: > org.apache.camel.converter.TimePatternConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.jaxp.DomConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.jaxp.StaxConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: > org.apache.camel.converter.jaxp.StreamSourceConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: org.apache.camel.converter.jaxp.XmlConverter > org.apache.camel.camel-core[org.apache.camel.impl.osgi.Activator] : > Loading converter class: > org.apache.camel.converter.stream.StreamCacheConverter > > which might correspond to the "Searching for annotations" line in your > log. Random thought...are annotations enabled in your JVM? > > I'm sending the rest of the pieces of my bundle (under separate cover, > as the list apparently eats attachments; available to others on > request). If that doesn't work for you either, my guess is something > in your Camel config. > > Don > > On Mon, Jun 27, 2011 at 12:26 PM, Michael Furtak <[email protected]> wrote: >> Hi Don, >> >> Thanks for your continued help. I've had my efforts diverted elsewhere for a >> bit, but I'm back to trying to explore this again today. >> >> Following this message: >> http://camel.465427.n5.nabble.com/Camel-under-OSGi-without-Spring-et-al-tp4507473p4511826.html >> >> I've modified my test environment slightly. I've added the >> TypeConverterLoader to the list of services that my CamelStarter requires >> before it activates. That means that it now binds a ComponentResolver with >> (component=file) and a TypeConverterLoader before the activate method is >> invoked. That is also visible in the log. However, the call to >> camelContext.start() still produces an exception. >> >> >> >> >> <?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"/> >> <reference bind="bindTypeConverterLoader" cardinality="1..1" >> interface="org.apache.camel.spi.TypeConverterLoader" >> name="TypeConverterLoader" policy="dynamic" >> unbind="unbindTypeConverterLoader"/> >> </scr:component> >> >> >> >> >> public class CamelStarter >> { >> private static final transient Logger LOG = >> LoggerFactory.getLogger(CamelStarter.class); >> >> protected void activate(ComponentContext context) >> { >> try >> { >> LOG.trace("activating"); >> CamelContext camelContext = new >> OsgiDefaultCamelContext(context.getBundleContext()); >> camelContext.start(); >> } >> catch (Throwable t) >> { >> t.printStackTrace(); >> } >> } >> >> 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 >> } >> >> protected void bindTypeConverterLoader(TypeConverterLoader tcl) >> { >> LOG.trace("Binding TypeConverterLoader"); >> // Ignored, since the ComponentResolver is not directly used >> } >> >> protected void unbindTypeConverterLoader(TypeConverterLoader tcl) >> { >> LOG.trace("Unbinding TypeConverterLoader"); >> // Ignored, since the ComponentResolver is not directly used >> } >> } >> >> >> >> I've also tweaked my logging settings to capture Camel's output, in the hope >> that it provides some more context: >> >> >> >> <START CONSOLE> >> >> [27 Jun 2011 12:20:11] INFO [Start Level Event Dispatcher] Activator - >> Camel activator starting >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: scala-library >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.osgi.services >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.equinox.event >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.equinox.util >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.equinox.ds >> [27 Jun 2011 12:20:11] INFO [Start Level Event Dispatcher] Activator - >> Camel activator started >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/bean in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/browse in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/class in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/dataset in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/direct in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/file in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/language in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/log in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/mock in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/properties in >> bundle org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/ref in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/seda in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/timer in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/component/vm in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/bean in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/constant in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/file in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/header in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/property in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/simple in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/tokenize in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Found entry: META-INF/services/org/apache/camel/language/xpath in bundle >> org.apache.camel.camel-core >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.osgi.util >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: com.cra.camel.core.osgi >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: se.scalablesolutions.akka.actor >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: commons-management >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.equinox.log >> [27 Jun 2011 12:20:11] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.apache.log4j >> [27 Jun 2011 12:20:11] TRACE [Component Resolve Thread] CamelStarter - >> Binding ComponentResolver >> [27 Jun 2011 12:20:11] TRACE [Component Resolve Thread] CamelStarter - >> Binding TypeConverterLoader >> [27 Jun 2011 12:20:11] TRACE [Component Resolve Thread] CamelStarter - >> activating >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultPackageScanClassResolver - Adding ContextClassLoader from current >> thread: org.eclipse.core.runtime.internal.adaptor.ContextFinder@193722c >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiCamelContextNameStrategy >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiClassResolver >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiFactoryFinderResolver >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiPackageScanClassResolver >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> OsgiPackageScanClassResolver - Adding ContextClassLoader from current >> thread: org.eclipse.core.runtime.internal.adaptor.ContextFinder@193722c >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiComponentResolver >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiLanguageResolver >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> OsgiCamelContextHelper - Using OsgiDataFormatResolver >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> OsgiDefaultCamelContext - Apache Camel (CamelContext: 13-camel-2) is >> starting >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> OsgiDefaultCamelContext - JMX enabled. Using ManagedManagementStrategy. >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Starting service: >> org.apache.camel.management.ManagedManagementStrategy@1865b28 >> [27 Jun 2011 12:20:12] WARN [Component Resolve Thread] >> OsgiDefaultCamelContext - Cannot find needed classes for JMX lifecycle >> strategy. Needed class is in spring-context.jar using Spring 2.5 or newer >> (spring-jmx.jar using Spring 2.0.x). NoClassDefFoundError: >> org/springframework/jmx/export/metadata/JmxAttributeSource >> [27 Jun 2011 12:20:12] WARN [Component Resolve Thread] >> OsgiDefaultCamelContext - Cannot use JMX. Fallback to using >> DefaultManagementStrategy (non JMX). >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Starting service: org.apache.camel.core.osgi.OsgiTypeConverter@1d62270 >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] OsgiTypeConverter - >> AddingService: {org.apache.camel.spi.TypeConverterLoader}={service.id=36} >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] OsgiTypeConverter$1 >> - Adding ContextClassLoader from current thread: >> org.eclipse.core.runtime.internal.adaptor.ContextFinder@193722c >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultTypeConverter - Adding fallback type converter: >> org.apache.camel.impl.converter.ToStringTypeConverter@d73c7a which can >> promote: false >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultTypeConverter - Adding fallback type converter: >> org.apache.camel.impl.converter.PropertyEditorTypeConverter@1e845c2 which >> can promote: false >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultTypeConverter - Adding fallback type converter: >> org.apache.camel.impl.converter.EnumTypeConverter@125fefa which can promote: >> true >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultTypeConverter - Adding fallback type converter: >> org.apache.camel.impl.converter.ArrayTypeConverter@19e8f17 which can >> promote: true >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultTypeConverter - Adding fallback type converter: >> org.apache.camel.impl.converter.FutureTypeConverter@13ad33d which can >> promote: false >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> DefaultTypeConverter - Adding fallback type converter: >> org.apache.camel.impl.converter.AsyncProcessorTypeConverter@7109c4 which can >> promote: true >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Starting service: >> org.apache.camel.impl.converter.DefaultTypeConverter@1aed5f9 >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Starting service: >> org.apache.camel.impl.converter.PropertyEditorTypeConverter@1e845c2 >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> DefaultTypeConverter - Loading type converters ... >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> AnnotationTypeConverterLoader - Loading file >> META-INF/services/org/apache/camel/TypeConverter to retrieve list of >> packages, from url: >> bundleresource://5.fwk5184781/META-INF/services/org/apache/camel/TypeConverter >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] OsgiTypeConverter$1 >> - Searching for annotations of org.apache.camel.Converter in packages: >> [org.apache.camel.component.file, org.apache.camel.component.bean, >> org.apache.camel.converter] >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] OsgiTypeConverter$1 >> - Found: [] >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Stopping service >> org.apache.camel.impl.converter.PropertyEditorTypeConverter@1e845c2 >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> OsgiDefaultCamelContext - Apache Camel (CamelContext:13-camel-2) is >> shutting down >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> DefaultShutdownStrategy - Starting to graceful shutdown 0 routes (timeout >> 300 seconds) >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] >> DefaultExecutorServiceStrategy - Created new single thread pool for source: >> org.apache.camel.impl.DefaultShutdownStrategy@4ecfdd with name: >> ShutdownTask. -> >> java.util.concurrent.Executors$FinalizableDelegatedExecutorService@30d82d >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] >> ExecutorServiceHelper - Created thread[ShutdownTask]: Thread[Camel Thread 0 >> - ShutdownTask,5,main] >> [27 Jun 2011 12:20:12] DEBUG [Camel Thread 0 - ShutdownTask] >> DefaultShutdownStrategy - There are 0 routes to shutdown >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> DefaultShutdownStrategy - Graceful shutdown of 0 routes completed in 0 >> seconds >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Service already stopped: org.apache.camel.core.osgi.OsgiTypeConverter@1d62270 >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Shutting down service org.apache.camel.core.osgi.OsgiTypeConverter@1d62270 >> [27 Jun 2011 12:20:12] TRACE [Component Resolve Thread] ServiceHelper - >> Stopping service >> org.apache.camel.management.DefaultManagementStrategy@164dbd5 >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> OsgiDefaultCamelContext - Uptime: 0.063 seconds >> [27 Jun 2011 12:20:12] INFO [Component Resolve Thread] >> OsgiDefaultCamelContext - Apache Camel (CamelContext: 13-camel-2) is >> shutdown in 0.016 seconds >> 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:21) >> 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 java.lang.Thread.run(Thread.java:619) >> 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 >> [27 Jun 2011 12:20:12] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: com.cra.camelsandbox.core >> [27 Jun 2011 12:20:12] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: slf4j.api >> [27 Jun 2011 12:20:12] DEBUG [Start Level Event Dispatcher] Activator - >> Bundle started: org.eclipse.osgi >> >> <END CONSOLE> >> >> >> >> The lines: >> >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] OsgiTypeConverter$1 >> - Searching for annotations of org.apache.camel.Converter in packages: >> [org.apache.camel.component.file, org.apache.camel.component.bean, >> org.apache.camel.converter] >> [27 Jun 2011 12:20:12] DEBUG [Component Resolve Thread] OsgiTypeConverter$1 >> - Found: [] >> >> ...seem indicative of the problem to my untrained eye. Do you have any >> further thoughts about what I am doing wrong? >> >> >> >> Thanks again, >> -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: Tuesday, June 21, 2011 4:10 PM >> To: [email protected] >> Subject: Re: Camel under OSGi without Spring et al. >> >> 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 >>> >>> >> >> > >
