There is something strange. I receive a NPE exception at the line
where I create an exchange from consumer :
@EndpointInject(name = "queueReportingEndpoint")
private Endpoint endpoint;
private ConsumerTemplate consumer;
public List<Map<String, Object>> collectMessages() {
Log.info("Endpoint : " + endpoint.getEndpointUri());
Exchange exch = consumer.receive(endpoint);
If I call directly consumer.receiveBody(endpoint, List.class); I have
the same error. I tough that the problem come from the endpoint
injection, but I have also a NPE if I use the uri of the endpoint in
the receiveBody method
Here is the trace :
Time=Mon Sep 21 15:00:00 CEST 2009, calendar=null,
previousFireTime=Mon Sep 21 14:58:00 CEST 2009,
CamelBeanMethodName=null}, BodyType:org.quartz.JobDetail,
Body:JobDetail
'DEFAULT.quartz://x3sReporting/clientError?cron=0+0%2F2+9-18+%3F+*+MON-FRI':
jobClass: 'org.apache.camel.component.quartz.CamelJob isStateful:
false isVolatile: false isDurable: false requestsRecovers: false
15:00:00,000 | INFO | heduler_Worker-2 | x3s
| rg.apache.camel.processor.Logger 88 | Exchange[
, BodyType:org.quartz.JobDetail
, Body:JobDetail
'DEFAULT.quartz://x3sReporting/clientError?cron=0+0%2F2+9-18+%3F+*+MON-FRI':
jobClass: 'org.apache.camel.component.quartz.CamelJob isStateful:
false isVolatile: false isDurable: false requestsRecovers: false
, CaughtExceptionType:java.lang.NullPointerException,
CaughtExceptionMessage:null, StackTrace:java.lang.NullPointerException
at
com.xpectis.x3s.core.util.ReportingConsumer.collectMessages(ReportingConsumer.java:27)
Charles Moulliard
Senior Enterprise Architect
Apache Camel Committer
*****************************
blog : http://cmoulliard.blogspot.com
On Mon, Sep 21, 2009 at 2:12 PM, Claus Ibsen <[email protected]> wrote:
> On Mon, Sep 21, 2009 at 2:05 PM, Charles Moulliard <[email protected]>
> wrote:
>> @EndpointInject(uri="") only accepts as parameter an uri / name or
>> context but not a reference to a spring bean
>>
>
> Its the name attribute that is the ref, maybe we should rename it :)
>
>
>
>> Charles Moulliard
>> Senior Enterprise Architect
>> Apache Camel Committer
>>
>> *****************************
>> blog : http://cmoulliard.blogspot.com
>>
>>
>>
>> On Mon, Sep 21, 2009 at 1:59 PM, Claus Ibsen <[email protected]> wrote:
>>> On Mon, Sep 21, 2009 at 1:55 PM, Charles Moulliard <[email protected]>
>>> wrote:
>>>> Sorry for my mistake.
>>>>
>>>> I have used @consume because it was possible to pass as a parameter
>>>> the name of the endpoint to consume. Is there a way to do this with a
>>>> consumer template ?
>>>>
>>>
>>> You can IoC the endpoint in the bean
>>>
>>> @EndpointInjected(ref = "foo")
>>> private Endpoint foo;
>>>
>>> but I would assume consumer template also works like producer template with
>>> IoC
>>> ( if not we should add it)
>>>
>>> @EndpointInjected(ref = "foo")
>>> private ConsumerTemplate consumer;
>>>
>>>
>>> See more
>>> http://camel.apache.org/bean-injection.html
>>>
>>>> regards,
>>>>
>>>> Charles Moulliard
>>>> Senior Enterprise Architect
>>>> Apache Camel Committer
>>>>
>>>> *****************************
>>>> blog : http://cmoulliard.blogspot.com
>>>>
>>>>
>>>>
>>>> On Mon, Sep 21, 2009 at 1:50 PM, Claus Ibsen <[email protected]> wrote:
>>>>> On Mon, Sep 21, 2009 at 1:46 PM, Charles Moulliard <[email protected]>
>>>>> wrote:
>>>>>> The POJO defined in the following route consumes immediately messages
>>>>>> posted on a queue and in consequence is not triggered by the Quartz
>>>>>> timer
>>>>>>
>>>>>> <camel:from
>>>>>> uri="quartz://x3sReporting/clientError?cron=0+0/5+9-18+?+*+MON-FRI"/>
>>>>>> <camel:doTry>
>>>>>> <camel:bean ref="reportingConsumer"
>>>>>> method="collectMessages"/>
>>>>>> ...
>>>>>>
>>>>>> public class ReportingConsumer {
>>>>>>
>>>>>> �...@consume(ref = "queueReportingEndpoint") // = x3s:report queue
>>>>>> public List<Map<String, Object>> collectMessages(List<Map<String,
>>>>>> Object>> received) {
>>>>>>
>>>>>> List<Map<String, Object>> result = new ArrayList<Map<String,
>>>>>> Object>>();
>>>>>>
>>>>>> if (received != null) {
>>>>>>
>>>>>> Log.info("Received exchange : " +
>>>>>> received.size());
>>>>>> for(Map<String, Object> model : received) {
>>>>>>
>>>>>> Log.info("Map received : " +
>>>>>> model.toString());
>>>>>> // Add model received into the result
>>>>>> output list
>>>>>> result.add( model );
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> return result;
>>>>>> }
>>>>>>
>>>>>> Question : How can I avoid that the bean consumes immediately messages
>>>>>> from the queue and wait quartz triggering ?
>>>>>
>>>>> You cannot as @Consume(ref = "queueReportingEndpoint") has ABSOLUTELY
>>>>> nothing to do with quartz.
>>>>> It creates a new event driven consumer which listen on new messages
>>>>> arriving on that JMS queue.
>>>>>
>>>>> You can remove the @Consume and then let quartz invoke it from the Camel
>>>>> route.
>>>>>
>>>>> And then you can in your bean use a consumer template to read messages
>>>>> from the JMS queue.
>>>>> Now you bean is only invoked when quartz triggers.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> Charles Moulliard
>>>>>> Senior Enterprise Architect
>>>>>> Apache Camel Committer
>>>>>>
>>>>>> *****************************
>>>>>> blog : http://cmoulliard.blogspot.com
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Claus Ibsen
>>>>> Apache Camel Committer
>>>>>
>>>>> Open Source Integration: http://fusesource.com
>>>>> Blog: http://davsclaus.blogspot.com/
>>>>> Twitter: http://twitter.com/davsclaus
>>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Claus Ibsen
>>> Apache Camel Committer
>>>
>>> Open Source Integration: http://fusesource.com
>>> Blog: http://davsclaus.blogspot.com/
>>> Twitter: http://twitter.com/davsclaus
>>>
>>
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>