[aerogear-dev] SwitchYard/Camel Integration
Matthias Wessendorf
matzew at apache.org
Wed Jan 2 08:45:16 EST 2013
Hey,
that sounds good. I like the idea of giving a guide to the users, and later
on, there can be even something that we ship, as an extension!
Nice document, btw!
-M
On Wed, Jan 2, 2013 at 2:41 PM, Daniel Bevenius
<daniel.bevenius at gmail.com>wrote:
> 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
>>
>>
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/aerogear-dev/attachments/20130102/1b3eaef9/attachment-0001.html
More information about the aerogear-dev
mailing list