Prazer, Apache Camel

Quando o tema na mesa é java, geralmente nos lembramos das tecnologias "padrões" da plataforma. Como Hibernate, WebLogic, Jboss e as espeficiações java. Porém hoje o ambiente JEE é muito mais complexo que isso. E este artigo fala um pouco sobre um framework pouco divulgada, mas muito útil.

Hoje em dia, é comum termos sistemas se comunicando com webservices, mainframes e outros sistemas. Nestes ambientes, geralmente temos diversos tipos de protocolos de comunicação e para cada protocolo, um framework ou peculiariedades próprias. O que fazem com que novos membros da equipe tenham um curva de aprendizado muito maior.

É ai que entra o Apache Camel, um framework java baseado em padrões de integração, ou em inglês enterprise integration patterns, EIP. Um dos pontos fortes do framework é poder utilizar as DSLs dele para se comunicar com diferentes protocolos. Não sendo necessário implementar um cliente de JMS, aprender a api do HttpClient da Apache para se comunicar com serviços Rest ou qualquer coisa do tipo. Tudo isso, fica por debaixo dos panos quando usamos o Camel. Bastando para nós desenvolvedores definir a rota de processamento que precisamos(e algumas configurações como qualquer coisa em JEE :P):

from("direct:fazerDoc")         .to("cxfrs:bean:meuServicoRest")        .to("jms:docQueue");

-> DSL, rotas e processamento?

O Apache Camel utiliza-se de uma DSL própria (com versões em Java, XML, Scala, entre outras) para definir rotas de processamento. Essas rotas contém uma URI de entrada(podendo-se utilizar de rotas que só funcionem no contexto do Camel, ou URIs utilizando-se protocolos bem conhecidos como JMS, HTTP ou qualquer outro protocolo que tenha um componente Camel o implementando. Dentro da rota, podemos definir processors, que nada mais são que objetos java que implementem a interface Processor ou até mesmo enviar a requisição para outras rotas.

Processors são utilizados, como o próprio nome sugere, para efetuar o processamento da rota. É comum uma rota ter diversos processors. Sendo possível assim criar Processors genéricos que podem ser reaproveitados.

A possibilidade de encaminhar dois protocolos/endereços para a mesma rota, facilita a integração com protocolos legados sem a duplicação de código. Por exemplo, se antes utilizavamos uma fila JMS para efetuar um doc do usuário e agora vamos passar a suportar o protocolo Rest, podemos fazer:

from("jms:efeturaDocUsuarioQueue")      to("direct:processarDocUsuario");

from("cxfrs:bean:meuServicoRest").to("direct:processarDocUsuario");

from("direct:processarDocUsuario").proccessRef("EfetuarDocProcessor");

O código acima define três rotas, a primeira com a URI de entrada sendo a fila JMS, a segunda um serviço Rest utilizando o componente Apache Cxf. Ambas redirecionando a requisição para a terceira rota, que contém um processor.

A DSL possibilita a criação de rotas mais complexas com tratamento de erros, com diferentes caminhos dependendo de headers e diferentes estratégias de EIP.

-> Headers?

O processamento na rota é feito utilizando-se um objeto do tipo Exchange. Este objeto tem um body, que contém o objeto a ser processado(parametros de um serviço rest, o objeto inserido na fila e assim por diante), além de headers para o controle de rotas(seja de componentes ou até mesmo o seu próprio controle).

-> IDE?

Se você escolher utilizar a DSL Java para criar as rotas, pode contar com a ajuda do autocomplete do próprio Eclipse para criar as suas rotas, porém fazer elas via XML pode lhe dar razões para se matar. Para estes casos, pode-se usar a Fuse IDE. Eu pessoalmente nunca utilizei, e eu odeio utilizar interface gráfica para programar, mas pelo que eu vi parece ser bem legal.

Além de poder criar as rotas de maneira visual pelo Fuse, também é possível criar os jUnits delas de forma automática(eu sinceramente acho extremamente chato fazer o teste unitários das rotas).

-> Como Core da aplicação!

Em todo o texto, procurei dar enfase na possibilidade de se usar o Camel para integrar o seu sistema com outros(como ponto de entrada ou de saída), porém nos últimos meses tenho trabalhado em um projeto que utiliza o Apache Camel como o core da aplicação, todos os pontos de entrada do sistema passam por rotas e não utilizamos nenhum EJB, somente Processors do Camel. Tem sido uma ótima experiência, já que o sistema em sí é basicamente uma grande cola entre diversos sistemas(incluindo serviços rest, mainframe e filas jms).

Neste projeto em particular, utilizamos também o Spring para facilitar o uso do Camel. Inclusive o próprio Apache Camel tem uma ótima documentação sobre isso.

Se você acha que este framework pode ser uma boa ferramenta no seu projeto, dê uma olhada nas referências que utilizei para escrever este texto. Eles se aprofundam bem mais nos primeiros passos e como utilizar o Camel de maneira real. Só recomendo a leitura da documentação oficial, depois de ter passado por outros blogs, pois a documentação do Apache, apesar de completa, é sempre complicada de se ler.

-> Referências

Open Source Integration with Apache Camel and How Fuse IDE Can Help

Documentação oficial

Easy Integration with Apache Camel and Fuse IDE