Camel has its own EventNotifier where you get callbacks on when its
started / stopped etc
http://camel.apache.org/advanced-configuration-of-camelcontext-using-spring.html

In your code you can still block but only if you do it from a separte
thread, eg new Thread() ...

On Tue, Apr 11, 2017 at 4:55 PM, Artur Jablonski
<[email protected]> wrote:
> Hello Claus
>
> Right, so
>
> 1. I cannot send a message without blocking because the event calback seems
> to be triggered BEFORE the CamelContext is fully up and running.
> That's kind of counter intuitive. I would imagine that when Spring's
> ApplicationContext has been fully initialized all the beans are fully
> initialized and ready to go... including CamelContext and all the routes....
> 2. I cannot block in that method not to deadlock the whole Spring machinery.
> Fair enough.
>
> So I need to spawn a new thread that I assume needs to poke the
> CamelContext about whether it's state is 'started'....ok, can do that, but
> perhaps it's not the most elegant solution. Any reason why Camel cannot be
> fully up and running before Spring?
>
> Cheerio
> Artur
>
>
> On Tue, Apr 11, 2017 at 3:34 PM, Claus Ibsen <[email protected]> wrote:
>
>> Dont use the event listener to do code that may block
>> @EventListener(ContextRefreshedEvent.class)
>>
>> You are basically hi-jacking the spring thread that signals this
>> event. You can create a new thread to send the message from the event
>> listener so you dont block it.
>>
>>
>>
>>
>> On Tue, Apr 11, 2017 at 1:30 PM, Artur Jablonski
>> <[email protected]> wrote:
>> > Hello,
>> >
>> > I have the Camel + Spring + SpringBoot combo working
>> >
>> >
>> > I have my RouteBilder Spring Component that's being pickup up and started
>> > during Spring startup.
>> > The route starts fine as I can see SpringCamelContext output in the logs.
>> >
>> > What I am trying to do is to send a message to direct endpoint using
>> > injected ProducerTemplate but if I do it like this
>> >
>> > @Produce(uri = "direct:myQueue")
>> > private ProducerTemplate producerTemplate;
>> >
>> > @EventListener(ContextRefreshedEvent.class)
>> > public void send()
>> >     throws Exception
>> > {
>> >     producerTemplate.start();
>> >     producerTemplate.sendBody("hello");
>> > }
>> >
>> >
>> > I am getting
>> >
>> >  No consumers available on endpoint: direct://myQueue
>> >
>> > because the route has not started yet and if I try blocking parameter on
>> > uri like this:
>> >
>> > @Produce(uri = "direct:myQueue?block=true")
>> >
>> > then the whole thing freezes for 30 secs (default timeout) and then blows
>> > up with the same exception
>> >
>> > I also tried to call the producerTemplate.sendBody() form @PostConstruct
>> > annotaded method with the same effect.
>> >
>> >
>> > How do I wait for the CamelContext to be fully started in this
>> context????
>> >
>> >
>> > Cheerio
>> > Arur
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> http://davsclaus.com @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>>



-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to