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