No mais recente projeto java que rola por aqui de que tanto falo, as integrações com sistemas externos serão muito mais do que meras interações esporádicas, são parte essencial da captação de quase todos os dados que existirão no produto.
Sei que a maior parte do tão falado SOA não passam de um hype, sendo que tudo que existe hoje neste sentido parece muito mais com uma coleção de design patterns catalogados especificamente para organizar as aplicações de modo a minimizar os impactos de integrações com sistemas Back-End, mas de qualquer maneira, as possibilidades de utilizar-se deste paradigma em Java são bastante interessantes, e é a respeito desta experiência que tivémos na última semana é que irei tentar reportar.
Como já falei, o projeto em questão receberá quase que 100% de suas informações a partir de dados provenientes de sistemas Back-End do cliente, utilizando-se maneiras e protocolos diversos. Dado o cenário, observamos a necessidade de separar os processos de integração do sistema de sua semântica, de seu objetivo. Neste sentido, as perspectivas ofertados pelo paradigma SOA parecem surgir com certa precisão para alcançar esta meta. Como em Java sempre existe a liberdade de escolha, que nos permite alcançar o mesmo objetivo utilizando-se diversos frameworks e produtos, existem diversas alternativas para implementar aplicações que utilizam o paradigma SOA. O importante nesta situação é optar por alternativas que seguem alguma API ou especificação JSR. isto lhe trará seguranças em diversos aspectos, principalmente ao vender (ou tentar vender) seu produto.
As APIs em Java que trarão o paradigma SOA à sua aplicação, fazem parte da JSR 208 - JBI (Java Business Integration). As características completas da especificação podem ser encontradas aqui, mas em essência diria que API foi construída no modelo de Web Services, integrando os consumidores e provedores de informações através de componentes plugáveis, chamados de Service Units (SU). Estes componentes plugáveis são divididos em duas categorias (se é que posso dizer assim):
- Binding Components (BC): São os componentes que representam os meios de acesso ou consumo da informação necessária, ou do seu próprio processo. Dentre os BCs existentes, teríamos por exemplo: SOAP, HTTP, FILE, Message Queue, CICS e etc, implementando portanto, como consumir ou disponibilizar determinada informação.
- Service Engines (SE): São componentes que fazem parte do seu processo de integração e realizam tarefas específicas. Poderíamos ter por exemplo, service engines que executam tranformações de strings XML, acessam bases de dados, objetos EJB ou outros web services.
Os processos de integração que utilizam BCs e SEs em ambiente JBI são realizados de diversas formas, dentre elas processos BPEL, onde podemos harmonizar todas as condições nas quais as interações entre nossos componentes devem acontecer, em qual tempo e em qual ordem. A composição dos diversos SUs, dá origem a uma aplicação composta, chamada de Service Assembly (SA).
O interessante nisto tudo é ressaltar que o JBI define as formas (dentre muitas outras coisas) nas quais os componentes BC e SE devem ser construídos, quais interfaces devem implementar e quais arquivos xml devem ser providos.Isto facilita e muito a adição de novos Service Units, tornando a adição de novas tecnologias como CEP por exemplo, muito facilitada. Um viva aos padrões!!!
Durante a avaliação dos JBI Servers gratuitos que implementem JBI e que possuísem fonte aberto, os produtos que comparei por um tempo foram esses (não tive muito tempo, mas acho que o que pude ver foi bastante satisfatório):
Apache ServiceMix - Esta é a implementação JBI da Apache Software Foundation. Apesar de parecer bastante simples ao fazer download, minha impressão a respeito do ServiceMix é que ele não serve muito bem para iniciantes. Faz-se necessário um conhecimento bastante grande a respeito de suas especificações, das estruturas de diretórios necessárias, dos arquivos xml de configuração e por aí vai… Não consegui encontrar nenhum plugin para o eclipse que realmente tenham valido a pena, ou que me poupassem ao menos metado do trabalho necessário para publicar uma aplicação “Hello World”. Um problema grande (e bota grande nisso) é o fato de os tutorias publicados no site da Apache conterem diversos (e absurdos) erros, o que dificulta e muito seu aprendizado. Uma das coisas bacanas é a disponibilização de diversos builds Maven para empacotamento dos deploys.
Mule - Apesar de bastante utilizado e comentado, não implementa especificação nenhuma, portanto não pude olhar este cara muito a fundo. Segundo os artigos e tutorias que li, é bastante rápido, fáicl de gerenciar e de se usar. Como não segue nenhuma especificação, cuidado se escolhê-lo, você pode morrer abraçado a ele.
Open ESB - É de longe o mais fácil de se utilizar e um dos mais completos em termos de Binding Components disponíveis após download. Antigo See Beyond, hoje é a base da distribuição Java CAPS da SUN. Seu uso através do editor CASA NetBeans é muito intuitivo e apresenta resultados muito de maneira muito rápida. Além do que, os tutorias disponíveis no site da comunidade NetBeans estão muito bem escritos e realmente funcionam. Possui integração facilitada com servidores GlassFish e JBOSS, o que o torna uma excelente opção tanto para aprendizado como para ambiente produtivo.
É isot, neste post procurei descrever de maneira um pouco abstrata talvez, como a plataforma Java soluciona os paradigmas SOA através de suas especificações e APIs, além de apresentar algumas opções de ESBs disponpiveis. Nos próximos POSTS, colocarei alguns exemplos interessantes de aplicações que não consegui encontrar na internet e tivemos que descobrir na marra. Também vou escrever a respeito de CEP, que parece ser algo bastante promissor daqui pra frente!