You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Sven Bauhan <sv...@ast.dfs.de> on 2013/03/18 10:03:42 UTC

Incomplete Registry interface [was: base class for context component?]

Hi,

I think for the interface Registry a method bind() should be defined. 
Here comes the explanation why:

Finally I managed to create a camel context component to put a route in 
a black box. But I want to put this context component into a library and 
hide it behind an API.

Starting point was the description in 
http://camel.apache.org/context.html and the detailed example in 
http://svn.apache.org/viewvc/camel/trunk/components/camel-context/src/test/java/org/apache/camel/component/context/JavaDslBlackBoxTest.java?revision=1069442&view=markup

In the given example, the blackbox is not put in a separate library. But 
if I put it in a library it looks this way:

public class ContextComponent {
     public static CamelContext createContext() throws Exception {
         DefaultCamelContext atsm_context = new DefaultCamelContext();
         atsm_context.setName("ATSM");
         atsm_context.addRoutes(new ContextRouteBuilder());
         atsm_context.start();
         return atsm_context;
     }
}

public class ATSMTest extends CamelTestSupport {

     @Override
     protected JndiRegistry createRegistry() throws Exception {
         JndiRegistry registry = super.createRegistry();
         CamelContext atsm_context = ContextComponent.createContext();
         registry.bind("atsm", atsm_context);
         return registry;
     }

     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {

             @Override
             public void configure() throws Exception {
                 ...
             }
         };
     }

     @Test
     public void TestRoute() throws Exception {
         ...
     }
}

The drawback here is, that the registry binding has to be done in the 
application not in the library.

I tried to give the registry reference to the createContext( Registry 
registry), to call the bind() method. But then I have to cast the 
registry to JndiRegistry, to call bind(). So this would only work if the 
application uses a JndiRegistry.
If the interface Registry would define a bind() method, this would work 
for all registry kinds.
(For SimpleRegistry the bind() method have to call put() internally).

Is my idea correct or would this lead to other problems?

Thanks, Sven


Re: Incomplete Registry interface [was: base class for context component?]

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

Camel is a client that lookup in an existing registry you use, eg
Spring App Context, CDI, Guice, OSGi Service Registry, JNDI, or
whatever you may write as custom registry.

Camel comes with a few out of the box, JndiRegistry, SimpleRegistry.

So if you want to use a registry where you can add/bind your own
beans, then use one of these and pass it to the constructor of the
DefaultCamelContext

SimpleRegistry reg = new SimpleRegistry()
reg.put("foo", new FooBean());

CamelContext camel = new DefaultCamelContext(reg);


We cannot have a bind/put method on the registry api, as Camel is
registry agnostic and uses it as a client, where we can only lookup in
the registry.



On Mon, Mar 18, 2013 at 10:03 AM, Sven Bauhan <sv...@ast.dfs.de> wrote:
> Hi,
>
> I think for the interface Registry a method bind() should be defined. Here
> comes the explanation why:
>
> Finally I managed to create a camel context component to put a route in a
> black box. But I want to put this context component into a library and hide
> it behind an API.
>
> Starting point was the description in http://camel.apache.org/context.html
> and the detailed example in
> http://svn.apache.org/viewvc/camel/trunk/components/camel-context/src/test/java/org/apache/camel/component/context/JavaDslBlackBoxTest.java?revision=1069442&view=markup
>
> In the given example, the blackbox is not put in a separate library. But if
> I put it in a library it looks this way:
>
> public class ContextComponent {
>     public static CamelContext createContext() throws Exception {
>         DefaultCamelContext atsm_context = new DefaultCamelContext();
>         atsm_context.setName("ATSM");
>         atsm_context.addRoutes(new ContextRouteBuilder());
>         atsm_context.start();
>         return atsm_context;
>     }
> }
>
> public class ATSMTest extends CamelTestSupport {
>
>     @Override
>     protected JndiRegistry createRegistry() throws Exception {
>         JndiRegistry registry = super.createRegistry();
>         CamelContext atsm_context = ContextComponent.createContext();
>         registry.bind("atsm", atsm_context);
>         return registry;
>     }
>
>     @Override
>     protected RouteBuilder createRouteBuilder() throws Exception {
>         return new RouteBuilder() {
>
>             @Override
>             public void configure() throws Exception {
>                 ...
>             }
>         };
>     }
>
>     @Test
>     public void TestRoute() throws Exception {
>         ...
>     }
> }
>
> The drawback here is, that the registry binding has to be done in the
> application not in the library.
>
> I tried to give the registry reference to the createContext( Registry
> registry), to call the bind() method. But then I have to cast the registry
> to JndiRegistry, to call bind(). So this would only work if the application
> uses a JndiRegistry.
> If the interface Registry would define a bind() method, this would work for
> all registry kinds.
> (For SimpleRegistry the bind() method have to call put() internally).
>
> Is my idea correct or would this lead to other problems?
>
> Thanks, Sven
>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
FuseSource is now part of Red Hat
Email: cibsen@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen