camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Antonin Stefanutti <anto...@stefanutti.fr>
Subject Re: CDI questions
Date Wed, 06 Apr 2016 15:09:41 GMT
Hi Tim,

> On 06 Apr 2016, at 16:19, Tim Dudgeon <tdudgeon.ml@gmail.com> wrote:
> 
> I've found a couple of things I don't understand when using the camel-cdi component.
> 
> 1. The @ContextName("customname") annotation can be used to specify a custom name for
the camel context. But I'm finding that this annotation is essential.
> e.g. if my app comprise just of a couple of classes extending RoutBuilder then I MUST
have this annotation present.
> I would have assumed that if I only have a single CamelContext then this would have been
unnecessary?

This should work as you assume. For example, if you execute the following test:

@RunWith(Arquillian.class)
public class CdiTest {

    @Deployment
    public static Archive<?> deployment() {
        return ShrinkWrap.create(JavaArchive.class)
            // Camel CDI
            .addPackage(CdiCamelExtension.class.getPackage())
            // Bean archive deployment descriptor
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    static class FirstRoute extends RouteBuilder {

        @Override
        public void configure() {
            from("direct:first").to("mock:first");
        }
    }

    static class SecondRoute extends RouteBuilder {

        @Override
        public void configure() {
            from("direct:second").to("mock:second");
        }
    }

    @Test
    public void test() {
    }
}

You see that the two route builders get added to the default Camel context:

2016-04-06 16:56:53,201 INFO  [           main] o.a.c.c.CdiCamelExtension                :
Camel CDI is starting Camel context [camel-1]
2016-04-06 16:56:53,202 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Apache Camel 2.17.0 (CamelContext: camel-1) is starting
2016-04-06 16:56:53,581 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Route: route1 started and consuming from: Endpoint[direct://second]
2016-04-06 16:56:53,585 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Route: route2 started and consuming from: Endpoint[direct://first]
2016-04-06 16:56:53,586 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Total 2 routes, of which 2 are started.
2016-04-06 16:56:53,587 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Apache Camel 2.17.0 (CamelContext: camel-1) started in 0.385 seconds
2016-04-06 16:56:53,649 INFO  [           main] o.a.c.c.CamelContextProducer             :
Camel CDI is stopping Camel context [camel-1]
2016-04-06 16:56:53,649 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Apache Camel 2.17.0 (CamelContext: camel-1) is shutting down
2016-04-06 16:56:53,651 INFO  [           main] o.a.c.i.DefaultShutdownStrategy          :
Starting to graceful shutdown 2 routes (timeout 300 seconds)
2016-04-06 16:56:53,655 INFO  [ - ShutdownTask] o.a.c.i.DefaultShutdownStrategy          :
Route: route2 shutdown complete, was consuming from: Endpoint[direct://first]
2016-04-06 16:56:53,655 INFO  [ - ShutdownTask] o.a.c.i.DefaultShutdownStrategy          :
Route: route1 shutdown complete, was consuming from: Endpoint[direct://second]
2016-04-06 16:56:53,656 INFO  [           main] o.a.c.i.DefaultShutdownStrategy          :
Graceful shutdown of 2 routes completed in 0 seconds
2016-04-06 16:56:53,660 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Apache Camel 2.17.0 (CamelContext: camel-1) uptime 0.459 seconds
2016-04-06 16:56:53,660 INFO  [           main] o.a.c.i.DefaultCamelContext              :
Apache Camel 2.17.0 (CamelContext: camel-1) is shutdown in 0.011 seconds

Could you please send more details about your deployment so that I can help identify why that
is not working as expected?

> 2. I'm try to use a custom thread pool. As described in the docs I use a @Producer to
generate the thread pool profile:
> 
> public class CamelContextFactory {
> 
> @Produces
> @ApplicationScoped
> CamelContext customize() {
> DefaultCamelContext context = new DefaultCamelContext();
> context.setName("mycontext");
> ThreadPoolProfile profile = new ThreadPoolProfileBuilder("poolName").poolSize(4).maxPoolSize(50).build();
> context.getExecutorServiceManager().registerThreadPoolProfile(profile);
> return context;
> }
> }
> 
> This seems to be executed as expected, but when I try to use the thread pool in a route
like this:
> 
> from("direct:foo" )
> .threads().executorServiceRef("poolName")
> .log("route executed");
> 
> then the pool can't be found:
> 
> Caused by: java.lang.IllegalArgumentException: ExecutorServiceRef poolName not found
in registry or as a thread pool profile.

The lookup is done by name so you need to have a @Named("poolName") bean deployed or have
the ExecutorService register manually into the Camel context (which you do but for some reasons
it does not get found).

So in your example, I would try:

@Produces
@Named("poolName")
ThreadPoolProfile profile() {
    return ThreadPoolProfileBuilder("poolName").poolSize(4).maxPoolSize(50).build();
}

And without using a custom Camel context.

> Thanks for any advice on these.
> Tim

Let me know if that helps.

Antonin


Mime
View raw message