Hello Guillaume!

Interesting point - not sure what I think yet. I create the camel
context the following way:

CamelContextFactory camelContextFactory;
camelContextFactory = new CamelContextFactory();
camelContextFactory.setBundleContext(theBundleContext);
CamelContext camelContext;
camelContext = mCamelContextFactory.createContext();

No, I'm not using Spring but I'm pretty sure I use camel's OSGI
support. I'm not just creating a DefaultCamelContext.

I think that by doing "the trick", I make sure that the bundles are
resolved and started before my service is started. However, it may
still take a little while before the registration is done and Spring
does not seem to wait for that. The delay between starting the
camel-core bundle and until all components are registered is what I
thought I had to wait for.

I know that without "the trick", just sleeping for a second does not
work at all. I've tried that. However, I wasn't aware about the
Require-Bundle header that you mention. Maybe it achieves the same
thing. Does it make sure that the required bundle is started or is it
just resolved?

Without having checked, I imagine that camel-osgi has an activator
that registers a tracker that inspects all loaded bundles for camel
components to be registered - including the components in camel-core.
This means that there can be a little delay from the time that
camel-core is started until camel-osgi has registered these
components. I thought I was taking care of that delay.

What do you think?

/Bengt


2010/5/2 Guillaume Nodet <[email protected]>:
> I fear your trick does not really work.  I think all it does is force your
> iPojo application to sleep for 1 second before starting, which is enough to
> make sure the required camel components are registerd.   However you still
> need this delay.   What I was proposing would have work (I think) if you
> were using spring to create the camel context.
>
> If you don't use spring, I suppose you don't use camel-spring-osgi either
> and you just use camel-core.   In such a case the problem is much simpler,
> as adding a Require-Bundle header on the needed components would make sure
> the components are available.  You just need to use the standard
> CamelContext and not the OSGi one.
>
> On Sat, May 1, 2010 at 23:27, Bengt Rodehav <[email protected]> wrote:
>
>> I've now tried your suggested workaround and I think I've got it to
>> work. Since I create my routes in Java DSL in components instantiated
>> by iPOJO (not Spring), it wasn't all that straight forward.
>>
>> I needed to publish an OSGI service from Spring that my iPOJO services
>> could depend on (using @Requires).
>>
>> This is my spring file:
>>
>> ...
>>
>>  <bean id="fileComponent"
>> class="org.apache.camel.component.file.FileComponent"/>
>>
>>   <bean id="camelServiceBean"
>> class="se.digia.connect.core.service.impl.CamelService">
>>    <property name="fileComponent" ref="fileComponent" />
>>  </bean>
>>
>>  <spring-osgi:service ref="camelServiceBean"
>> interface="se.digia.connect.core.service.ICamelService"/>
>> ...
>>
>> I instantiate a bean that has a FileComponent injected. I can then
>> inject other Camel components should I need to require them as well. I
>> then publish this bean as an OSGI service using Spring. I define a
>> "tag interface" that my services can depend on.
>>
>> This is the CamelService class:
>>
>> public class CamelService implements ICamelService {
>>  public CamelService() throws InterruptedException {
>>    Thread.sleep(1000);
>>  }
>>  public void setFileComponent(FileComponent theFileComponent) {
>>  }
>> }
>>
>> I define a setter for the file component but I'm not really interested
>> in saving its value. Note that I defined a constructor in which I
>> sleep for a second. If I don't do this, then it won't work. 100 ms is
>> too short, but 1 s seems to work. This is a bit scary since it means
>> that not all components are registered at this point but shortly
>> thereafter.  Right now I'll make this delay configurable. Maybe you
>> can comment on this.
>>
>> In my dependent iPOJO services I then put:
>>
>> �...@requires
>>  private ICamelService mCamelService;
>>
>> I guess this could serve as a template workaround for making sure that
>> Camel is properly initialised before it's being used in an OSGI
>> environment. The trick (that you suggested) then is to use Spring to
>> let us know when the camel component is registered. We then publish an
>> OSGI service that other services can depend on.
>>
>> /Bengt
>>
>>
>> 2010/5/1 Bengt Rodehav <[email protected]>:
>> > Thanks for your reply Guillaume (on a saturday morning!),
>> >
>> > I define my routes using Java DSL but I guess I could still add a
>> > dependency via Spring like you suggest just to get the ordering to
>> > work.
>> >
>> > I'll try and let you know.
>> >
>> > As an aside, are you considering the possiblity for adding startlevels
>> > for the features? I know that ordering should ideally be handled using
>> > OSGI service dependencies but there will always be a need to make
>> > software that is not properly OSGI'fied to work as well. You mentioned
>> > in a previous post that there are some plans to enhance Karaf
>> > features. Do you have any information regarding what you are
>> > considering - and in what time frame?
>> >
>> > Thanks again,
>> >
>> > /Bengt
>> >
>> > 2010/5/1 Guillaume Nodet <[email protected]>:
>> >> I may have a work around.  You should try to define the components you
>> need
>> >> from inside your xml definition:
>> >>
>> >>  <bean id="file" class="org.apache.camel.component.file.FileComponent"
>> />
>> >>
>> >> The resolver will first look up in the spring registry, then the osgi
>> >> registry, then using the osgi custom discovery mechanism which requires
>> >> bundles to be started.
>> >> I'm thinking it should work.
>> >>
>> >> On Fri, Apr 30, 2010 at 21:53, Bengt Rodehav <[email protected]> wrote:
>> >>
>> >>> Hi again Guillaume,
>> >>>
>> >>> Sorry to bother you again Guillaume. Although I agree with you that
>> >>> Camel should use OSGI services to handle the dependency/ordering
>> >>> problem, I still need to get this to work.
>> >>>
>> >>> Right now I can't seem to figure out how to make sure the required
>> >>> Camel components are available. Trying to add all the required bundles
>> >>> to startup.properties seems like a hopeless task since Camel will
>> >>> bring in almost everything. I need both camel-core and
>> >>> camel-spring-osgi; which will bring in the following:
>> >>>
>> >>>  <feature name='camel-core' version='2.2.0'>
>> >>>    <feature version="2.5.6.SEC01">spring</feature>
>> >>>
>> >>>
>>  <bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.activation-api-1.1/1.4.0</bundle>
>> >>>
>> >>>
>>  <bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jaxb-api-2.1/1.4.0</bundle>
>> >>>
>> >>>
>>  <bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.stax-api-1.0/1.4.0</bundle>
>> >>>
>> >>>
>>  <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jaxb-impl/2.1.12_1</bundle>
>> >>>    <bundle>mvn:org.fusesource.commonman/commons-management/1.0</bundle>
>> >>>    <bundle>mvn:org.apache.camel/camel-core/2.2.0</bundle>
>> >>>  </feature>
>> >>>  <feature name='camel-spring-osgi' version='2.2.0'>
>> >>>
>> >>>
>>  <bundle>mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1</bundle>
>> >>>    <feature version='2.5.6.SEC01'>spring</feature>
>> >>>    <feature version='1.2.0'>spring-dm</feature>
>> >>>    <bundle>mvn:org.springframework/spring-tx/2.5.6.SEC01</bundle>
>> >>>    <feature version='2.2.0'>camel-core</feature>
>> >>>    <bundle>mvn:org.apache.camel/camel-spring-osgi/2.2.0</bundle>
>> >>>  </feature>
>> >>>
>> >>> I'm hoping there is a workaround (other than moving all my bundles
>> >>> from the feature file to startup.properties). There must be others who
>> >>> use the combination of Camel and Karaf and that need a clean way to
>> >>> install and start the application. Do you have any advice?
>> >>>
>> >>> Thanks,
>> >>>
>> >>> /Bengt
>> >>>
>> >>>
>> >>> 2010/4/28 Bengt Rodehav <[email protected]>:
>> >>> > Guillaume,
>> >>> >
>> >>> > I've been trying to modify startup.properties to make sure camel-core
>> >>> > is started by the time the feature containing my route is started.
>> >>> > Can't get it to work though. There are a lot of dependencies. Seems
>> >>> > like camel-core is dependent on a number of servicemix bundles as
>> well
>> >>> > as the spring feature. I think by the end of this I'll have to remove
>> >>> > almost everything from my features file and put the individual
>> bundles
>> >>> > in startup.properties.
>> >>> >
>> >>> > While waiting for support for specifying startup levels for features
>> >>> > (or something similar), is there another workaround I can use?
>> >>> >
>> >>> > /Bengt
>> >>> >
>> >>> > 2010/4/28 Bengt Rodehav <[email protected]>:
>> >>> >> Just sent a mail to [email protected] regarding this.
>> >>> >>
>> >>> >> /Bengt
>> >>> >>
>> >>> >> 2010/4/28 Bengt Rodehav <[email protected]>:
>> >>> >>> Thanks Guillaume,
>> >>> >>>
>> >>> >>> Yes, I agree, it would be much better if Camel published services
>> that
>> >>> >>> my services could depend on. I'll bring that up on the camel-dev
>> list
>> >>> >>> as you said.
>> >>> >>>
>> >>> >>> Do you have any details regarding enhancement plans for Karaf
>> features?
>> >>> >>>
>> >>> >>> /Bengt
>> >>> >>>
>> >>> >>> 2010/4/28 Guillaume Nodet <[email protected]>:
>> >>> >>>> Yes, there are plans to enhance, but I don't think this is the
>> problem
>> >>> here.
>> >>> >>>> This is a service dependency problem and those should either be
>> >>> captured by
>> >>> >>>> camel
>> >>> >>>> or by your bundle itself.  Actually, I think camel should be
>> enhanced,
>> >>> >>>> because it waits
>> >>> >>>> for bundles containing components to be started without using
>> >>> services, and
>> >>> >>>> that's wrong.
>> >>> >>>> The way to go would be to have a bundle tracker registering a
>> service
>> >>> for
>> >>> >>>> the component,
>> >>> >>>> even if it's a simple factory and not the real component.  That
>> would
>> >>> allow
>> >>> >>>> to have the
>> >>> >>>> spring-dm / blueprint application to add a reference to the
>> component
>> >>> >>>> somehow.
>> >>> >>>> Or have the camel context wait for the component to become
>> available
>> >>> with a
>> >>> >>>> timeout
>> >>> >>>> to cope with such ordering problems.   Not sure exactly what the
>> best
>> >>> way
>> >>> >>>> is, but there is
>> >>> >>>> definitely something to improve, as the current behavior is bad.
>> >>> >>>> You should bring that on the camel-dev/user list imho.
>> >>> >>>>
>> >>> >>>> On Wed, Apr 28, 2010 at 11:43, Bengt Rodehav <[email protected]>
>> >>> wrote:
>> >>> >>>>
>> >>> >>>>> Thanks for your reply Guillaume,
>> >>> >>>>>
>> >>> >>>>> I've now added a few bundles in the startup.properties (url
>> handlers)
>> >>> >>>>> and I get this to work. I used the startlevel 40. Is that OK or
>> is
>> >>> >>>>> there a best practice for this?
>> >>> >>>>>
>> >>> >>>>> However, I then move on to my bundles containing camel routes.
>> They
>> >>> >>>>> fail to install becuase the "file:" component is not registered
>> yet.
>> >>> >>>>> It seems like this is cascading. I guess, to get this to work I
>> must
>> >>> >>>>> then stop using the "camel-core" feature in my
>> >>> >>>>> org.apache.felix.karaf.features.cfg and put all (or some) of
>> those
>> >>> >>>>> bundles in the startup.properties as well. I don't like the
>> direction
>> >>> >>>>> I'm heading with this...
>> >>> >>>>>
>> >>> >>>>> Karaf features is a very good way to install/deploy applications
>> >>> based
>> >>> >>>>> on Karaf/Felix. However, there doesn't seem to be a good way to
>> >>> >>>>> achieve an automated, clean, install that way since there will
>> >>> >>>>> (almost) always be certain startup dependency ordering
>> requirements.
>> >>> >>>>>
>> >>> >>>>> Are there any plans to enhance Karaf features? It would be
>> extremely
>> >>> >>>>> useful to be able to specify the startlevel for a specific
>> feature. I
>> >>> >>>>> think that would completely solve the type of problems I'm
>> >>> >>>>> experiencing.
>> >>> >>>>>
>> >>> >>>>> What do you think?
>> >>> >>>>>
>> >>> >>>>> /Bengt
>> >>> >>>>>
>> >>> >>>>>
>> >>> >>>>>
>> >>> >>>>>
>> >>> >>>>>
>> >>> >>>>>
>> >>> >>>>> 2010/4/28 Guillaume Nodet <[email protected]>:
>> >>> >>>>> > Right, using url handlers could lead to such problems if the
>> url
>> >>> handlers
>> >>> >>>>> > are not registered yet.  I guess a possible solution would be
>> to
>> >>> change
>> >>> >>>>> the
>> >>> >>>>> > karaf configuration so that url handlers are installed and
>> started
>> >>> very
>> >>> >>>>> > early.
>> >>> >>>>> > This can be done by modifying the etc/startup.properties or
>> >>> modifying the
>> >>> >>>>> > start level of the bundles for your url handlers once they
>> >>> installed.
>> >>> >>>>> >
>> >>> >>>>> > On Wed, Apr 28, 2010 at 09:46, Bengt Rodehav <
>> [email protected]>
>> >>> wrote:
>> >>> >>>>> >
>> >>> >>>>> >> I have a problem with the startup ordering in Karaf. My
>> explicit
>> >>> >>>>> >> problem is that I use iPOJO's Online Manipulator which gives
>> me
>> >>> the
>> >>> >>>>> >> possibility to deploy iPOJO components using the "ipojo:"
>> >>> protocol.
>> >>> >>>>> >> However, it seems impossible to get an automatic installation
>> to
>> >>> work
>> >>> >>>>> >> using Karaf features this way.
>> >>> >>>>> >>
>> >>> >>>>> >> I need to have the iPOJO Online Manipulator started (not just
>> >>> >>>>> >> resolved) before I even try to resolve my iPOJO components
>> since I
>> >>> >>>>> >> refer to them using the "ipojo:" protocol. How can I solve
>> this? I
>> >>> was
>> >>> >>>>> >> hoping that it was possible to specify a startlevel for a
>> specific
>> >>> >>>>> >> feature (in the org.apache.felix.karaf.features.cfg) so that
>> it is
>> >>> >>>>> >> guaranteed to start after other required features.
>> >>> >>>>> >>
>> >>> >>>>> >> I have the same problem when deploying a war. In that case I
>> must
>> >>> be
>> >>> >>>>> >> sure that the "pax-url-war" feature is started first.
>> >>> >>>>> >>
>> >>> >>>>> >> This must be a common problem and I'm hoping there is a
>> standard
>> >>> >>>>> >> recommended way to handle this.
>> >>> >>>>> >>
>> >>> >>>>> >> I'm using Karaf 1.4.0 and iPOJO 1.4.0.
>> >>> >>>>> >>
>> >>> >>>>> >> /Bengt
>> >>> >>>>> >>
>> >>> >>>>> >>
>> >>> ---------------------------------------------------------------------
>> >>> >>>>> >> To unsubscribe, e-mail: [email protected]
>> >>> >>>>> >> For additional commands, e-mail: [email protected]
>> >>> >>>>> >>
>> >>> >>>>> >>
>> >>> >>>>> >
>> >>> >>>>> >
>> >>> >>>>> > --
>> >>> >>>>> > Cheers,
>> >>> >>>>> > Guillaume Nodet
>> >>> >>>>> > ------------------------
>> >>> >>>>> > Blog: http://gnodet.blogspot.com/
>> >>> >>>>> > ------------------------
>> >>> >>>>> > Open Source SOA
>> >>> >>>>> > http://fusesource.com
>> >>> >>>>> >
>> >>> >>>>>
>> >>> >>>>>
>> ---------------------------------------------------------------------
>> >>> >>>>> To unsubscribe, e-mail: [email protected]
>> >>> >>>>> For additional commands, e-mail: [email protected]
>> >>> >>>>>
>> >>> >>>>>
>> >>> >>>>
>> >>> >>>>
>> >>> >>>> --
>> >>> >>>> Cheers,
>> >>> >>>> Guillaume Nodet
>> >>> >>>> ------------------------
>> >>> >>>> Blog: http://gnodet.blogspot.com/
>> >>> >>>> ------------------------
>> >>> >>>> Open Source SOA
>> >>> >>>> http://fusesource.com
>> >>> >>>>
>> >>> >>>
>> >>> >>
>> >>> >
>> >>>
>> >>> ---------------------------------------------------------------------
>> >>> To unsubscribe, e-mail: [email protected]
>> >>> For additional commands, e-mail: [email protected]
>> >>>
>> >>>
>> >>
>> >>
>> >> --
>> >> Cheers,
>> >> Guillaume Nodet
>> >> ------------------------
>> >> Blog: http://gnodet.blogspot.com/
>> >> ------------------------
>> >> Open Source SOA
>> >> http://fusesource.com
>> >>
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>
>
> --
> Cheers,
> Guillaume Nodet
> ------------------------
> Blog: http://gnodet.blogspot.com/
> ------------------------
> Open Source SOA
> http://fusesource.com
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to