camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From alexey-s <alex...@mail.ru>
Subject Propose add annotation @BeanInject
Date Thu, 07 Nov 2013 13:19:18 GMT
It's no secret that the OSGI Blueprint implements a proxy object for the
service. In the old specification OSGI used references to objects.
Very often forget to let go of the service object obtained from the
ServiseReference.
For this reason, it is desirable to use the links provided in the blueprint.
Camel process can be described in a blueprint xml file. But it is not always
convenient. In particular, all of the components (bean) should be in the
open part of the osgi bundle.
Using a public method, referring to the components of the private part of
the osgi bundle is very bad. BIND swears by these methods.
There is only one. We must use the Java DSL Builder process.

<reference id="externalService" interface="external.ExternalService"/>

<bean id="routeBuilder" class="publicpackage.LocalRouteBuilder"/>
  
<camelContext id="camel-ccje-exchange-oos-doc-read"
xmlns="http://camel.apache.org/schema/blueprint">
  <propertyPlaceholder id="properties" location="blueprint:placeholder"/>
  <routeBuilder ref="routeBuilder"/>
</camelContext>

Inside RouteBuilder can use annotations @ PropertyInject, @ EndpointInject.
But to get service "externalService" can only be the old-fashioned

import external.ExternalService;
import privatepackage.MyBean;

public class LocalRouteBuilder extends RouteBuilder {
   public void configure() throws Exception {
      ExternalService externalService =
CamelContextHelper.mandatoryLookup(getContext(), "externalService",
ExternalService.class);
      MyBean bean = new MyBean(externalService);

      from("direct.start)
        .bean(bean, "doProcess")
      .end();
   }
}

Similarly, it was possible to get any property

String value = CamelContextHelper.parseText(getContext(),
"{{my_property}}");

or through annotation

@PropertyInject ("my_property") String value;


I propose to add an annotation @BeanInject

import external.ExternalService;
import privatepackage.MyBean;

public class LocalRouteBuilder extends RouteBuilder {
   @BeanInject(ref="externalService") ExternalService externalService;

   public void configure() throws Exception {
      MyBean bean = new MyBean(externalService);

      from("direct.start)
        .bean(bean, "doProcess")
      .end();
   }
}

In the blueprint and in spring you can pass all the components as properties
or constructor parameters.
This can be done in Guice, jndi, JUnit.

I am at the project using the OSGI blueprint for services and management
Camel processes. Inside guice for working with MyBatis, not to show the
private part of the OSGI bundle.

By the way. There is one nice little bug.
@Produce and @EndpointInject perform the same action in
DefaultCamelBeanPostProcessor.
We expect that the implementation of the @Produce is ProducerTemplate or
Producer. We can get ConsumerTemplate, PollingConsumer, Endpoint.

@Produce(url="direct.start")
ConsumerTemplate consumer; // raze it right?




--
View this message in context: http://camel.465427.n5.nabble.com/Propose-add-annotation-BeanInject-tp5742782.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Mime
View raw message