You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Charles Moulliard <cm...@gmail.com> on 2010/07/01 08:48:16 UTC

Re: Best way to retrieve a ProducerTemplate created in a camel bundle (OSGI)

Hi Willem,

I have find the missing piece. To be able to use@Autowired in a Java
class, the spring file containing the camel route must include :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
	  http://www.springframework.org/schema/beans
	  http://www.springframework.org/schema/beans/spring-beans.xsd
	  http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
	  http://camel.apache.org/schema/spring
	  http://camel.apache.org/schema/spring/camel-spring.xsd">
	
	<context:annotation-config/>

Kind regards,

Charles Moulliard

Senior Enterprise Architect (J2EE, .NET, SOA)
Apache Camel - ServiceMix Committer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Blog : http://cmoulliard.blogspot.com |  Twitter : http://twitter.com/cmoulliard
Linkedin : http://www.linkedin.com/in/charlesmoulliard | Skype: cmoulliard



On Wed, Jun 30, 2010 at 2:30 PM, Willem Jiang <wi...@gmail.com> wrote:
> Hi Charles,
>
> Please check out my test case here[1]
>
> [1]http://svn.apache.org/viewvc?rev=959163&view=rev
>
> Willem
> ----------------------------------
> Apache Camel, Apache CXF committer
> Open SOA http://www.fusesource.com
> Blog http://willemjiang.blogspot.com
> Tiwtter http://twitter.com/willemjiang
>
>
> Charles Moulliard wrote:
>>
>> Hi Willem,
>>
>> I have tried what you proposes but get a NPE when I try to use camel
>> ProducerTemplate in the class
>>
>>    @Autowired
>>    private ProducerTemplate producerTemplate;
>>
>>        <!-- add route in camel context -->
>>        <camelContext id="camelAlarmManager"
>> xmlns="http://camel.apache.org/schema/spring">
>>                <template id="camelTemplate" />
>>                <routeBuilder ref="alarmManager" />
>>
>>        </camelContext>
>>
>> Any idea is welcome ?
>>
>> KR,
>>
>> Charles Moulliard
>>
>> Senior Enterprise Architect (J2EE, .NET, SOA)
>> Apache Camel - ServiceMix Committer
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Blog : http://cmoulliard.blogspot.com |  Twitter :
>> http://twitter.com/cmoulliard
>> Linkedin : http://www.linkedin.com/in/charlesmoulliard | Skype: cmoulliard
>>
>>
>>
>> On Tue, Jun 29, 2010 at 3:53 PM, Willem Jiang <wi...@gmail.com>
>> wrote:
>>>
>>> Charles Moulliard wrote:
>>>>
>>>> There is no @Endpoint(ref="camelTemplate") annotation.
>>>>
>>>> If I use the following syntax -->  @Produce(context="camelTemplate"), it
>>>> works
>>>
>>> The CamelPostProcessor will not handle this injection, as they are using
>>> different camel context, so you don't get the exception.
>>>
>>> But the the template is not injected, and you can't use it to send
>>> message.
>>>
>>> Willem
>>> ----------------------------------
>>> Apache Camel, Apache CXF committer
>>> Open SOA http://www.fusesource.com
>>> Blog http://willemjiang.blogspot.com
>>> Tiwtter http://twitter.com/willemjiang
>>>
>>>> KR,
>>>>
>>>> Charles Moulliard
>>>>
>>>> Senior Enterprise Architect (J2EE, .NET, SOA)
>>>> Apache Camel - ServiceMix Committer
>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>> Blog : http://cmoulliard.blogspot.com |  Twitter :
>>>> http://twitter.com/cmoulliard
>>>> Linkedin : http://www.linkedin.com/in/charlesmoulliard | Skype:
>>>> cmoulliard
>>>>
>>>>
>>>>
>>>> On Tue, Jun 29, 2010 at 3:21 PM, Willem Jiang <wi...@gmail.com>
>>>> wrote:
>>>>>
>>>>> Charles Moulliard wrote:
>>>>>>
>>>>>> If I try to use annotation in the class requesting the Producer
>>>>>>
>>>>>>  @Produce(ref="camelTemplate")
>>>>>>  private ProducerTemplate producerTemplate;
>>>>>>
>>>>>> and
>>>>>>
>>>>>> Camel Spring XML file
>>>>>>
>>>>>>      <!-- add route in camel context -->
>>>>>>      <camelContext id="camelAlarmManager"
>>>>>> xmlns="http://camel.apache.org/schema/spring">
>>>>>>              <template id="camelTemplate" />
>>>>>>      </camelContext>
>>>>>>
>>>>>> I get the following error :
>>>>>>
>>>>>> Caused by: java.lang.IllegalArgumentException: registry entry called
>>>>>> camelTemplate of type org.apache.camel.Endpoint must be specified
>>>>>>      at
>>>>>> org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:244)
>>>>>>      at
>>>>>>
>>>>>>
>>>>>> org.apache.camel.util.CamelContextHelper.mandatoryLookup(CamelContextHelper.java:123)
>>>>>>      at
>>>>>>
>>>>>>
>>>>>> org.apache.camel.util.CamelContextHelper.getEndpointInjection(CamelContextHelper.java:138)
>>>>>>      at
>>>>>>
>>>>>>
>>>>>> org.apache.camel.impl.CamelPostProcessorHelper.getEndpointInjection(CamelPostProcessorHelper.java:125)
>>>>>>      at
>>>>>>
>>>>>>
>>>>>> org.apache.camel.impl.CamelPostProcessorHelper.createInjectionProducerTemplate(CamelPostProcessorHelper.java:167)
>>>>>>      at
>>>>>>
>>>>>>
>>>>>> org.apache.camel.impl.CamelPostProcessorHelper.getInjectionValue(CamelPostProcessorHelper.java:134)
>>>>>>      at
>>>>>>
>>>>>>
>>>>>> org.apache.camel.spring.CamelBeanPostProcessor.injectField(CamelBeanPostProcessor.java:215)
>>>>>>
>>>>>> What is wrong ?
>>>>>
>>>>> Can you check if your annotation has other kind of annotation like
>>>>> @Endpoint(ref="camelTemplate")?
>>>>>
>>>>> From the stack trace it looks like your class plan to inject a endpoint
>>>>> with
>>>>> the name of camelTemplate.
>>>>>
>>>>> Willem
>>>>>
>>>>>
>>>>>> KR,
>>>>>>
>>>>>>
>>>>>> Charles Moulliard
>>>>>>
>>>>>> Senior Enterprise Architect (J2EE, .NET, SOA)
>>>>>> Apache Camel - ServiceMix Committer
>>>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>> Blog : http://cmoulliard.blogspot.com |  Twitter :
>>>>>> http://twitter.com/cmoulliard
>>>>>> Linkedin : http://www.linkedin.com/in/charlesmoulliard | Skype:
>>>>>> cmoulliard
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Tue, Jun 29, 2010 at 2:36 PM, Willem Jiang <wi...@gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> I think we could export the CamelContext as the service, then use
>>>>>>> camelContext.getRegistry().lookup("producerTemplate") to get the
>>>>>>> template.
>>>>>>>
>>>>>>> Or we could think about export the producerTemplate as a service,
>>>>>>> than
>>>>>>> other
>>>>>>> bundle has a way to access certain camel context.
>>>>>>>
>>>>>>> Willem
>>>>>>> ----------------------------------
>>>>>>> Apache Camel, Apache CXF committer
>>>>>>> Open SOA http://www.fusesource.com
>>>>>>> Blog http://willemjiang.blogspot.com
>>>>>>> Tiwtter http://twitter.com/willemjiang
>>>>>>>
>>>>>>> Christian Schneider wrote:
>>>>>>>>
>>>>>>>>  Probably not directly but we could publish a service that serves
>>>>>>>> the
>>>>>>>> context. I am not sure if serving the context is a good idea though
>>>>>>>> as
>>>>>>>> it
>>>>>>>> promotes an
>>>>>>>> ugly style. It is like directly accessing a spring context. We
>>>>>>>> should
>>>>>>>> give
>>>>>>>> this some thoughts before starting. But Charles could already do
>>>>>>>> this
>>>>>>>> in
>>>>>>>> his
>>>>>>>> project for the mean
>>>>>>>> time.
>>>>>>>>
>>>>>>>> Greetings
>>>>>>>>
>>>>>>>> Christian
>>>>>>>>
>>>>>>>> Am 29.06.2010 08:00, schrieb Charles Moulliard:
>>>>>>>>>
>>>>>>>>> Can we export a camelContext (from one bundle) by exposing it as a
>>>>>>>>> OSGI service using<osgi:reference>  ?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Tue, Jun 29, 2010 at 1:56 AM, Willem
>>>>>>>>> Jiang<wi...@gmail.com>
>>>>>>>>>  wrote:
>>>>>>>>>>
>>>>>>>>>> Hi Charles,
>>>>>>>>>>
>>>>>>>>>> Both solutions are OK if you can get the SpringCamelContext for
>>>>>>>>>> your
>>>>>>>>>> bundle
>>>>>>>>>> utility.
>>>>>>>>>> And the option 1 is easy to understand :)
>>>>>>>>>>
>>>>>>>>>> Willem
>>>>>>>>>> ----------------------------------
>>>>>>>>>> Apache Camel, Apache CXF committer
>>>>>>>>>> Open SOA http://www.fusesource.com
>>>>>>>>>> Blog http://willemjiang.blogspot.com
>>>>>>>>>> Tiwtter http://twitter.com/willemjiang
>>>>>>>>>>
>>>>>>>>>> Charles Moulliard wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> I have two bundles, one playing the role of an utility package
>>>>>>>>>>> and
>>>>>>>>>>> another where the camel context instantiates a Camel
>>>>>>>>>>> ProducerTemplate.
>>>>>>>>>>> What is the best way to retrieve the ProducerTemplate from my
>>>>>>>>>>> bundle
>>>>>>>>>>> utility :
>>>>>>>>>>>
>>>>>>>>>>> 1) using SpringCamelContext -->  SpringCamelContext camel =
>>>>>>>>>>> (SpringCamelContext) ac.getBean("producerTemplate");
>>>>>>>>>>> 2) using @ProducerTemplate + ref to the bean object -->
>>>>>>>>>>> @ProducerTemplate(ref="producerTemplate");
>>>>>>>>>>> 3) ...
>>>>>>>>>>>
>>>>>>>>>>> Kind regards,
>>>>>>>>>>>
>>>>>>>>>>> Charles Moulliard
>>>>>>>>>>>
>>>>>>>>>>> Senior Enterprise Architect (J2EE, .NET, SOA)
>>>>>>>>>>> Apache Camel - ServiceMix Committer
>>>>>>>>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>> Blog : http://cmoulliard.blogspot.com |  Twitter :
>>>>>>>>>>> http://twitter.com/cmoulliard
>>>>>>>>>>> Linkedin : http://www.linkedin.com/in/charlesmoulliard | Skype:
>>>>>>>>>>> cmoulliard
>>>>>>>>>>>
>>>
>>
>
>