[aerogear-dev] SwitchYard/Camel Integration

Daniel Bevenius daniel.bevenius at gmail.com
Wed Jan 2 08:41:31 EST 2013


Hey Matthias,

there has been a discussion about having something like what you describe
for this.
At the moment there is not much to it, and if I was going to do this sort
of integration I think I'd use the Camel/SwitchYard APIs directly, but
having this as a reference or as a starting point would certainly
help. With the examples in the post hopefully we can decide if we should
provide an implementation, or if we should just have this more as a guide.

cheers,

/Dan



On 2 January 2013 14:27, Matthias Wessendorf <matzew at apache.org> wrote:

> Hi Dan,
>
> looks nice and simple. One quick question, is there more as a guide, or is
> there a plan to have some "plugins" (e.g. an additional JAR containing
> something like you described for the CamelController.java)?
>
> Greetings,
> Matthias
>
> On Wed, Jan 2, 2013 at 2:16 PM, Daniel Bevenius <daniel.bevenius at gmail.com
> > wrote:
>
>>
>> AeroGear Camel/SwitchYard Integration
>>
>> There have been inquiries about how existing services could be exposed
>> using AeroGear Controller, and this document will try to sort out why
>> someone would want to do this, and also try to come up with some possible
>> solutions.
>> Why would you want to do this?
>>
>> Currently one can already expose a service as a RESTful endpoint in Camel
>> using Camel's CXFRS Component <http://camel.apache.org/cxfrs.html>. The
>> same goes for a service in SwitchYard that can be exposed using the RestEasy
>> Component<https://docs.jboss.org/author/display/SWITCHYARD/RESTEasy+Bindings>
>> .
>>
>> So, a few reasons why users might opt to expose their services through
>> AeroGear controller:
>>
>>    - Consistent way of exposing enterprise services externally for mobil
>>    developers
>>    - Security
>>
>> Camel Integration
>>
>> Using Camel to integrate with existing services is a great option as
>> Camel has a huge number of components<http://camel.apache.org/components.html>.
>> There is a SwitchYard Camel component too, so integrating with SwitchYard
>> would also be possible using Camel. SwitchYard also has a new
>> RemoteInvoker<https://docs.jboss.org/author/display/SWITCHYARD/Remote+Invoker> which
>> could be used for SwitchYard specific services and would be a separate
>> controller class.
>>
>> The goal here is to make things as flexibile as possible as it is
>> difficult to try to account for different types of services. As a
>> suggestion, an AeroGear Controller route that invokes a service using Camel
>> might look like this:
>>
>> public class Routes extends AbstractRoutingModule {
>>
>>     @Override
>>     public void configuration() throws Exception {
>>         route()
>>                .from("/cars/{id}")
>>                .on(RequestMethod.GET)
>>                .to(CarServiceController.class).getCar("direct://input", param("id"));
>>     }}
>>
>> CarServiceController.class might look something like this:
>>
>> public class CarServiceController extends CamelController {
>>
>>     public String getCar(final String endpointUri, final String id) {
>>         return (String) producerTemplate().requestBody(endpointUri, Long.valueOf(id));
>>     }}
>>
>> CamelController is very simple and gets injected with a CdiCamelContext
>> and creates the ProducerTemplate.
>>
>> public abstract class CamelController {
>>
>>     @Inject
>>     private CdiCamelContext camelContext;
>>     private final ProducerTemplate producer;
>>
>>     public CamelController() {
>>         producer = this.camelContext.createProducerTemplate();
>>     }
>>
>>     protected ProducerTemplate producerTemplate() {
>>         return producer;
>>     }}
>>
>> We are simply making an instance of ProducerTemplate<http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/ProducerTemplate.html> available
>> to users, and they have access to all the methods of that interface. This
>> will enable users to send one way messages, request/response messages, and
>> also prepare the arguments to the service and process the result if needed.
>>
>> A ProducerTemplate is created from a CamelContext. One can have multiple
>> CamelContext's per application/deployment but the most common is that each
>> deployment has one CamelContext. In this case we are injecting
>> CdiCamelContext.
>>
>> We could also add additional methods from ProducerTemplate to
>> CamelController which just delegate, for example:
>>
>> public abstract class CamelController {
>>
>>     @Inject
>>     private CdiCamelContext camelContext;
>>     private final ProducerTemplate producer;
>>
>>     public CamelController() {
>>         producer = this.camelContext.createProducerTemplate();
>>     }
>>
>>     protected ProducerTemplate producerTemplate() {
>>         return producer;
>>     }
>>
>>     protected Object requestBody(final String endpointUri, final Object body) {
>>         return producer.requestBody(endpointUri, body);
>>     }
>>     //...more methods like requestBody}
>>
>> This would save subclasses from having to call producerTemplate().
>> SwitchYard Integration
>>
>> As mentioned above, SwitchYard has a RemoveInvoker that could be used for
>> invoking services from a remote client. This could be used in an AeroGear
>> route:
>>
>> public class Routes extends AbstractRoutingModule {
>>
>>     @Override
>>     public void configuration() throws Exception {
>>         route()
>>                .from("/server1/{id}")
>>                .on(RequestMethod.GET)
>>                .to(SwitchYard.class).invoke(
>>                    "http://localhost:8080/switchyard-remote",
>>                    "CarService",
>>                    pathParam("id"));
>>     }}
>>
>> SwitchYard is again very simple:
>>
>> public class SwitchYard {
>>
>>     public static final String REMOTE_SERVICE = "urn:com.example.switchyard:remote";
>>
>>     public Object invoke(final String url,
>>                          final String serviceName,
>>                          final Object payload) throws IOException {
>>         return new HttpInvoker(url).invoke(new RemoteMessage()
>>                 .setContext(new DefaultContext())
>>                 .setService(new QName(REMOTE_SERVICE, serviceName))
>>                 .setContent(payload))
>>                 .getContent();
>>     }   }
>>
>> The original gist can be found here: https://gist.github.com/4152998
>>
>>
>>
>> _______________________________________________
>> aerogear-dev mailing list
>> aerogear-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/aerogear-dev
>>
>>
>
>
> --
> Matthias Wessendorf
>
> blog: http://matthiaswessendorf.wordpress.com/
> sessions: http://www.slideshare.net/mwessendorf
> twitter: http://twitter.com/mwessendorf
>
> _______________________________________________
> aerogear-dev mailing list
> aerogear-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/aerogear-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/aerogear-dev/attachments/20130102/c6c3389a/attachment-0001.html 


More information about the aerogear-dev mailing list