My long running bean sending out messages

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

My long running bean sending out messages

Borut Bolčina
Hello,

I am trying to marry crawler4j with Camel and having some trouble sending
messages out of my bean. The producer is not instantiated - I get NPE.

My goal is to send each crawled page (html in string variable) to the next
stage in the route. If I simplify the crawler with a demo bean:

public class LongRunningBean {
    @Produce(uri = "direct:crawler")
    protected MyListener producer;
 List<String> outMessages = Arrays.asList("m1", "m2", "m3");
 public void startLongOperation() throws InterruptedException {

 for (String message : outMessages) {
 String response = producer.sendMessage(message); // NPE
 Thread.sleep(2000);
}
 }
}

and the

public interface MyListener {
String sendMessage(String message);
}

and my test route(s):

public class LongRunningBeanTest extends CamelTestSupport {

@Override
 protected RouteBuilder createRouteBuilder() throws Exception {
 return new RouteBuilder() {
 @Override
public void configure() throws Exception {
from("direct:start")
 .bean(LongRunningBean.class, "startLongOperation")
.to("log:bb.webcraft.crawler?level=DEBUG");
 from("direct:crawler")
.to("log:bb.webcraft.crawler?level=DEBUG");
 }
};
}

@Test
public void testLongRun() throws Exception {
template.sendBody("direct:start", "myDummyMessage");
 assert(true);
}
 }

I am getting NPE:

[2012/04/06 14:23:26.478] ERROR [o.a.c.p.DefaultErrorHandler:log]: Failed
delivery for (MessageId: ID-BOBB-50119-1333715006068-0-1 on ExchangeId:
ID-BOBB-50119-1333715006068-0-2). Exhausted after delivery attempt: 1
caught: java.lang.NullPointerException
java.lang.NullPointerException: null
at
bb.webcraft.crawler.LongRunningBean.startLongOperation(LongRunningBean.java:19)
~[test-classes/:na]


My goal is not to wait until the long running bean (crawler)
ends processing and then route an enormous number of objects in one
Exchange message, but send each crawled page's content to the next stage in
the route as soon as it is processed.

I saw only examples with activemq as producer's uri. Is this the trick?

And one more thing - I don't need a return message as in:

String response = producer.sendMessage(message);

How to use the @InOnly or something else?

Thanks,
Borut
Reply | Threaded
Open this post in threaded view
|

Re: My long running bean sending out messages

Claus Ibsen-2
Hi

What version of Camel are you using?

It looks like your bean does not get the @Produce injected from the
route when you do
 .bean(LongRunningBean.class, "startLongOperation")



On Fri, Apr 6, 2012 at 3:04 PM, Borut Bolčina <[hidden email]> wrote:

> Hello,
>
> I am trying to marry crawler4j with Camel and having some trouble sending
> messages out of my bean. The producer is not instantiated - I get NPE.
>
> My goal is to send each crawled page (html in string variable) to the next
> stage in the route. If I simplify the crawler with a demo bean:
>
> public class LongRunningBean {
>    @Produce(uri = "direct:crawler")
>    protected MyListener producer;
>  List<String> outMessages = Arrays.asList("m1", "m2", "m3");
>  public void startLongOperation() throws InterruptedException {
>
>  for (String message : outMessages) {
>  String response = producer.sendMessage(message); // NPE
>  Thread.sleep(2000);
> }
>  }
> }
>
> and the
>
> public interface MyListener {
> String sendMessage(String message);
> }
>
> and my test route(s):
>
> public class LongRunningBeanTest extends CamelTestSupport {
>
> @Override
>  protected RouteBuilder createRouteBuilder() throws Exception {
>  return new RouteBuilder() {
>  @Override
> public void configure() throws Exception {
> from("direct:start")
>  .bean(LongRunningBean.class, "startLongOperation")
> .to("log:bb.webcraft.crawler?level=DEBUG");
>  from("direct:crawler")
> .to("log:bb.webcraft.crawler?level=DEBUG");
>  }
> };
> }
>
> @Test
> public void testLongRun() throws Exception {
> template.sendBody("direct:start", "myDummyMessage");
>  assert(true);
> }
>  }
>
> I am getting NPE:
>
> [2012/04/06 14:23:26.478] ERROR [o.a.c.p.DefaultErrorHandler:log]: Failed
> delivery for (MessageId: ID-BOBB-50119-1333715006068-0-1 on ExchangeId:
> ID-BOBB-50119-1333715006068-0-2). Exhausted after delivery attempt: 1
> caught: java.lang.NullPointerException
> java.lang.NullPointerException: null
> at
> bb.webcraft.crawler.LongRunningBean.startLongOperation(LongRunningBean.java:19)
> ~[test-classes/:na]
>
>
> My goal is not to wait until the long running bean (crawler)
> ends processing and then route an enormous number of objects in one
> Exchange message, but send each crawled page's content to the next stage in
> the route as soon as it is processed.
>
> I saw only examples with activemq as producer's uri. Is this the trick?
>
> And one more thing - I don't need a return message as in:
>
> String response = producer.sendMessage(message);
>
> How to use the @InOnly or something else?
>
> Thanks,
> Borut



--
Claus Ibsen
-----------------
CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
FuseSource
Email: [hidden email]
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/
Reply | Threaded
Open this post in threaded view
|

Re: My long running bean sending out messages

Claus Ibsen-2
Hi

I reproduced the issue and logged a JIRA to improve this
https://issues.apache.org/jira/browse/CAMEL-5149

On Sat, Apr 7, 2012 at 11:05 AM, Claus Ibsen <[hidden email]> wrote:

> Hi
>
> What version of Camel are you using?
>
> It looks like your bean does not get the @Produce injected from the
> route when you do
>  .bean(LongRunningBean.class, "startLongOperation")
>
>
>
> On Fri, Apr 6, 2012 at 3:04 PM, Borut Bolčina <[hidden email]> wrote:
>> Hello,
>>
>> I am trying to marry crawler4j with Camel and having some trouble sending
>> messages out of my bean. The producer is not instantiated - I get NPE.
>>
>> My goal is to send each crawled page (html in string variable) to the next
>> stage in the route. If I simplify the crawler with a demo bean:
>>
>> public class LongRunningBean {
>>    @Produce(uri = "direct:crawler")
>>    protected MyListener producer;
>>  List<String> outMessages = Arrays.asList("m1", "m2", "m3");
>>  public void startLongOperation() throws InterruptedException {
>>
>>  for (String message : outMessages) {
>>  String response = producer.sendMessage(message); // NPE
>>  Thread.sleep(2000);
>> }
>>  }
>> }
>>
>> and the
>>
>> public interface MyListener {
>> String sendMessage(String message);
>> }
>>
>> and my test route(s):
>>
>> public class LongRunningBeanTest extends CamelTestSupport {
>>
>> @Override
>>  protected RouteBuilder createRouteBuilder() throws Exception {
>>  return new RouteBuilder() {
>>  @Override
>> public void configure() throws Exception {
>> from("direct:start")
>>  .bean(LongRunningBean.class, "startLongOperation")
>> .to("log:bb.webcraft.crawler?level=DEBUG");
>>  from("direct:crawler")
>> .to("log:bb.webcraft.crawler?level=DEBUG");
>>  }
>> };
>> }
>>
>> @Test
>> public void testLongRun() throws Exception {
>> template.sendBody("direct:start", "myDummyMessage");
>>  assert(true);
>> }
>>  }
>>
>> I am getting NPE:
>>
>> [2012/04/06 14:23:26.478] ERROR [o.a.c.p.DefaultErrorHandler:log]: Failed
>> delivery for (MessageId: ID-BOBB-50119-1333715006068-0-1 on ExchangeId:
>> ID-BOBB-50119-1333715006068-0-2). Exhausted after delivery attempt: 1
>> caught: java.lang.NullPointerException
>> java.lang.NullPointerException: null
>> at
>> bb.webcraft.crawler.LongRunningBean.startLongOperation(LongRunningBean.java:19)
>> ~[test-classes/:na]
>>
>>
>> My goal is not to wait until the long running bean (crawler)
>> ends processing and then route an enormous number of objects in one
>> Exchange message, but send each crawled page's content to the next stage in
>> the route as soon as it is processed.
>>
>> I saw only examples with activemq as producer's uri. Is this the trick?
>>
>> And one more thing - I don't need a return message as in:
>>
>> String response = producer.sendMessage(message);
>>
>> How to use the @InOnly or something else?
>>
>> Thanks,
>> Borut
>
>
>
> --
> Claus Ibsen
> -----------------
> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> FuseSource
> Email: [hidden email]
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/



--
Claus Ibsen
-----------------
CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
FuseSource
Email: [hidden email]
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/
Reply | Threaded
Open this post in threaded view
|

Re: My long running bean sending out messages

Borut Bolčina
Hello,

thanks for the time to look into it!

So in Camel version 2.9.2 the above LongRunningBean will send out messages
as expected? What about the @InOnly? When sending the messages out I do not
need/expect a return/confirmation message. How will I achieve this?

And, is there an ETA on 2.9.2? Thanks!

-borut

Dne 07. april 2012 11:44 je Claus Ibsen <[hidden email]> napisal/-a:

> Hi
>
> I reproduced the issue and logged a JIRA to improve this
> https://issues.apache.org/jira/browse/CAMEL-5149
>
> On Sat, Apr 7, 2012 at 11:05 AM, Claus Ibsen <[hidden email]>
> wrote:
> > Hi
> >
> > What version of Camel are you using?
> >
> > It looks like your bean does not get the @Produce injected from the
> > route when you do
> >  .bean(LongRunningBean.class, "startLongOperation")
> >
> >
> >
> > On Fri, Apr 6, 2012 at 3:04 PM, Borut Bolčina <[hidden email]>
> wrote:
> >> Hello,
> >>
> >> I am trying to marry crawler4j with Camel and having some trouble
> sending
> >> messages out of my bean. The producer is not instantiated - I get NPE.
> >>
> >> My goal is to send each crawled page (html in string variable) to the
> next
> >> stage in the route. If I simplify the crawler with a demo bean:
> >>
> >> public class LongRunningBean {
> >>    @Produce(uri = "direct:crawler")
> >>    protected MyListener producer;
> >>  List<String> outMessages = Arrays.asList("m1", "m2", "m3");
> >>  public void startLongOperation() throws InterruptedException {
> >>
> >>  for (String message : outMessages) {
> >>  String response = producer.sendMessage(message); // NPE
> >>  Thread.sleep(2000);
> >> }
> >>  }
> >> }
> >>
> >> and the
> >>
> >> public interface MyListener {
> >> String sendMessage(String message);
> >> }
> >>
> >> and my test route(s):
> >>
> >> public class LongRunningBeanTest extends CamelTestSupport {
> >>
> >> @Override
> >>  protected RouteBuilder createRouteBuilder() throws Exception {
> >>  return new RouteBuilder() {
> >>  @Override
> >> public void configure() throws Exception {
> >> from("direct:start")
> >>  .bean(LongRunningBean.class, "startLongOperation")
> >> .to("log:bb.webcraft.crawler?level=DEBUG");
> >>  from("direct:crawler")
> >> .to("log:bb.webcraft.crawler?level=DEBUG");
> >>  }
> >> };
> >> }
> >>
> >> @Test
> >> public void testLongRun() throws Exception {
> >> template.sendBody("direct:start", "myDummyMessage");
> >>  assert(true);
> >> }
> >>  }
> >>
> >> I am getting NPE:
> >>
> >> [2012/04/06 14:23:26.478] ERROR [o.a.c.p.DefaultErrorHandler:log]:
> Failed
> >> delivery for (MessageId: ID-BOBB-50119-1333715006068-0-1 on ExchangeId:
> >> ID-BOBB-50119-1333715006068-0-2). Exhausted after delivery attempt: 1
> >> caught: java.lang.NullPointerException
> >> java.lang.NullPointerException: null
> >> at
> >>
> bb.webcraft.crawler.LongRunningBean.startLongOperation(LongRunningBean.java:19)
> >> ~[test-classes/:na]
> >>
> >>
> >> My goal is not to wait until the long running bean (crawler)
> >> ends processing and then route an enormous number of objects in one
> >> Exchange message, but send each crawled page's content to the next
> stage in
> >> the route as soon as it is processed.
> >>
> >> I saw only examples with activemq as producer's uri. Is this the trick?
> >>
> >> And one more thing - I don't need a return message as in:
> >>
> >> String response = producer.sendMessage(message);
> >>
> >> How to use the @InOnly or something else?
> >>
> >> Thanks,
> >> Borut
> >
> >
> >
> > --
> > Claus Ibsen
> > -----------------
> > CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> > FuseSource
> > Email: [hidden email]
> > Web: http://fusesource.com
> > Twitter: davsclaus, fusenews
> > Blog: http://davsclaus.blogspot.com/
> > Author of Camel in Action: http://www.manning.com/ibsen/
>
>
>
> --
> Claus Ibsen
> -----------------
> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> FuseSource
> Email: [hidden email]
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/
>
Reply | Threaded
Open this post in threaded view
|

Re: My long running bean sending out messages

Claus Ibsen-2
Hi

If you dont need a response, then set your MyListener sendMessage
method to be void.
Then Camel uses InOnly



On Sat, Apr 7, 2012 at 5:36 PM, Borut Bolčina <[hidden email]> wrote:

> Hello,
>
> thanks for the time to look into it!
>
> So in Camel version 2.9.2 the above LongRunningBean will send out messages
> as expected? What about the @InOnly? When sending the messages out I do not
> need/expect a return/confirmation message. How will I achieve this?
>
> And, is there an ETA on 2.9.2? Thanks!
>
> -borut
>
> Dne 07. april 2012 11:44 je Claus Ibsen <[hidden email]> napisal/-a:
>
>> Hi
>>
>> I reproduced the issue and logged a JIRA to improve this
>> https://issues.apache.org/jira/browse/CAMEL-5149
>>
>> On Sat, Apr 7, 2012 at 11:05 AM, Claus Ibsen <[hidden email]>
>> wrote:
>> > Hi
>> >
>> > What version of Camel are you using?
>> >
>> > It looks like your bean does not get the @Produce injected from the
>> > route when you do
>> >  .bean(LongRunningBean.class, "startLongOperation")
>> >
>> >
>> >
>> > On Fri, Apr 6, 2012 at 3:04 PM, Borut Bolčina <[hidden email]>
>> wrote:
>> >> Hello,
>> >>
>> >> I am trying to marry crawler4j with Camel and having some trouble
>> sending
>> >> messages out of my bean. The producer is not instantiated - I get NPE.
>> >>
>> >> My goal is to send each crawled page (html in string variable) to the
>> next
>> >> stage in the route. If I simplify the crawler with a demo bean:
>> >>
>> >> public class LongRunningBean {
>> >>    @Produce(uri = "direct:crawler")
>> >>    protected MyListener producer;
>> >>  List<String> outMessages = Arrays.asList("m1", "m2", "m3");
>> >>  public void startLongOperation() throws InterruptedException {
>> >>
>> >>  for (String message : outMessages) {
>> >>  String response = producer.sendMessage(message); // NPE
>> >>  Thread.sleep(2000);
>> >> }
>> >>  }
>> >> }
>> >>
>> >> and the
>> >>
>> >> public interface MyListener {
>> >> String sendMessage(String message);
>> >> }
>> >>
>> >> and my test route(s):
>> >>
>> >> public class LongRunningBeanTest extends CamelTestSupport {
>> >>
>> >> @Override
>> >>  protected RouteBuilder createRouteBuilder() throws Exception {
>> >>  return new RouteBuilder() {
>> >>  @Override
>> >> public void configure() throws Exception {
>> >> from("direct:start")
>> >>  .bean(LongRunningBean.class, "startLongOperation")
>> >> .to("log:bb.webcraft.crawler?level=DEBUG");
>> >>  from("direct:crawler")
>> >> .to("log:bb.webcraft.crawler?level=DEBUG");
>> >>  }
>> >> };
>> >> }
>> >>
>> >> @Test
>> >> public void testLongRun() throws Exception {
>> >> template.sendBody("direct:start", "myDummyMessage");
>> >>  assert(true);
>> >> }
>> >>  }
>> >>
>> >> I am getting NPE:
>> >>
>> >> [2012/04/06 14:23:26.478] ERROR [o.a.c.p.DefaultErrorHandler:log]:
>> Failed
>> >> delivery for (MessageId: ID-BOBB-50119-1333715006068-0-1 on ExchangeId:
>> >> ID-BOBB-50119-1333715006068-0-2). Exhausted after delivery attempt: 1
>> >> caught: java.lang.NullPointerException
>> >> java.lang.NullPointerException: null
>> >> at
>> >>
>> bb.webcraft.crawler.LongRunningBean.startLongOperation(LongRunningBean.java:19)
>> >> ~[test-classes/:na]
>> >>
>> >>
>> >> My goal is not to wait until the long running bean (crawler)
>> >> ends processing and then route an enormous number of objects in one
>> >> Exchange message, but send each crawled page's content to the next
>> stage in
>> >> the route as soon as it is processed.
>> >>
>> >> I saw only examples with activemq as producer's uri. Is this the trick?
>> >>
>> >> And one more thing - I don't need a return message as in:
>> >>
>> >> String response = producer.sendMessage(message);
>> >>
>> >> How to use the @InOnly or something else?
>> >>
>> >> Thanks,
>> >> Borut
>> >
>> >
>> >
>> > --
>> > Claus Ibsen
>> > -----------------
>> > CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
>> > FuseSource
>> > Email: [hidden email]
>> > Web: http://fusesource.com
>> > Twitter: davsclaus, fusenews
>> > Blog: http://davsclaus.blogspot.com/
>> > Author of Camel in Action: http://www.manning.com/ibsen/
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
>> FuseSource
>> Email: [hidden email]
>> Web: http://fusesource.com
>> Twitter: davsclaus, fusenews
>> Blog: http://davsclaus.blogspot.com/
>> Author of Camel in Action: http://www.manning.com/ibsen/
>>



--
Claus Ibsen
-----------------
CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
FuseSource
Email: [hidden email]
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/