Neste post, irei mostrar como é possível integrar o SAP ao JBoss ESB, de forma que o ESB possa receber eventos e mensagens do SAP, e processá-lo na sua arquitetura de pipelines como se fosse uma mensagem oriunda de qualquer outro endpoint (File, JMS, SOAP, etc). Mas antes de mergulharmos nos detalhes sobre como fazer isso no JBoss ESB, é importante que você conheça como é o mecanismo de acesso ao SAP, a saber, a tecnologia SAP JCo.SAP JCo Technology
A empresa SAP, ao reconhecer o poder da plataforma Java, lançou a alguns anos atrás uma tenologia de acesso aos sistemas SAP baseada em CORBA, onde era possível acessá-lo através das linguagens C e Visual Basic. Na arquitetura da solução, eram criados várias interfaces definidas em IDL, e com um compilador proprietário da SAP, stubs nas linguagens citadas eram gerados fazendo com que o acesso ao SAP fosse concedido. Entretanto, este modelo era realmente frustrante de ser usado, pois a cada alteração no modelo do SAP ou das funções acessadas acarretava na geração inteira da IDL, o que comprometia bastante a produtividade de desenvolvimento.
No final do ano 2000, a SAP criou uma tecnologia baseada em JNI que possibilitava que programadores Java pudessem acessar rotinas e dados do SAP com maior flexibilidade e facilidade. Esta solução foi chamada de JCo. Além da facildade de acesso, O JCo possibilita que aplicações SAP possam chamar aplicações Java e vice-versa.
Hoje, o JCo é a tecnologia mais usada no mundo Java para acesso ao SAP, mesmo que existam conectores JCA disponiveis no mercado para isso. De fato, qualquer conector JCA, seja da própria SAP ou de terceiros, se baseia no JCo na sua implementação interna, portanto, conhecer o JCo é a chave para promover integrações robustas com o SAP através da tecnologia Java.
A instalação do JCo é muito simples. Basta fazer o download do arquivo ZIP ou TAR disponivel no site da SAP (você deve ser um cliente SAP para poder fazer este download) e descompactá-lo em qualquer diretório do seu computador. Se você for acessar o SAP a partir do Windows, ou seja, executar seu barramento de serviços no Windows, vocẽ deve copiar as três DLL's que vem com o pacote para o diretório C:\Windows\System32, e colocar o arquivo sapjco.jar para o classpath do Java ou do Application Server que você deseja fazer acesso.
Para as demais plataformas suportadas pela SAP (IBM AIX, Solaris, HP-UX e Linux) a instalação é semelhante, a diferença é apenas onde colocar as bibliotecas nativas do SAP (no caso do Linux, os arquivos .so) de forma que estes sejam acessíveis pelo componente de acesso nativo, o arquivo sapjco.jar. Feito isso, é hora de entender como o JCo funciona. A figura abaixo explana arquitetônicamente a pilha de acesso que envolve sistemas Java e a plataforma SAP.

A empresa SAP, ao reconhecer o poder da plataforma Java, lançou a alguns anos atrás uma tenologia de acesso aos sistemas SAP baseada em CORBA, onde era possível acessá-lo através das linguagens C e Visual Basic. Na arquitetura da solução, eram criados várias interfaces definidas em IDL, e com um compilador proprietário da SAP, stubs nas linguagens citadas eram gerados fazendo com que o acesso ao SAP fosse concedido. Entretanto, este modelo era realmente frustrante de ser usado, pois a cada alteração no modelo do SAP ou das funções acessadas acarretava na geração inteira da IDL, o que comprometia bastante a produtividade de desenvolvimento.
No final do ano 2000, a SAP criou uma tecnologia baseada em JNI que possibilitava que programadores Java pudessem acessar rotinas e dados do SAP com maior flexibilidade e facilidade. Esta solução foi chamada de JCo. Além da facildade de acesso, O JCo possibilita que aplicações SAP possam chamar aplicações Java e vice-versa.
Hoje, o JCo é a tecnologia mais usada no mundo Java para acesso ao SAP, mesmo que existam conectores JCA disponiveis no mercado para isso. De fato, qualquer conector JCA, seja da própria SAP ou de terceiros, se baseia no JCo na sua implementação interna, portanto, conhecer o JCo é a chave para promover integrações robustas com o SAP através da tecnologia Java.
A instalação do JCo é muito simples. Basta fazer o download do arquivo ZIP ou TAR disponivel no site da SAP (você deve ser um cliente SAP para poder fazer este download) e descompactá-lo em qualquer diretório do seu computador. Se você for acessar o SAP a partir do Windows, ou seja, executar seu barramento de serviços no Windows, vocẽ deve copiar as três DLL's que vem com o pacote para o diretório C:\Windows\System32, e colocar o arquivo sapjco.jar para o classpath do Java ou do Application Server que você deseja fazer acesso.
Para as demais plataformas suportadas pela SAP (IBM AIX, Solaris, HP-UX e Linux) a instalação é semelhante, a diferença é apenas onde colocar as bibliotecas nativas do SAP (no caso do Linux, os arquivos .so) de forma que estes sejam acessíveis pelo componente de acesso nativo, o arquivo sapjco.jar. Feito isso, é hora de entender como o JCo funciona. A figura abaixo explana arquitetônicamente a pilha de acesso que envolve sistemas Java e a plataforma SAP.

A API Java para acesso ao SAP fornecida pelo JCo é tão trivial quanto a API de JDBC, até mesmo os conceitos são semelhantes. A única diferença, é a forma como os dados são recebidos e enviados para o SAP, pois é necessário o conhecimento do dicionário interno do SAP para a troca de informações. A listagem abaixo mostra um pequeno código que abre uma conexão com o SAP, e consulta algumas informações sobre lista de materiais, simulando o acesso ao módulo de materiais do SAP R/3.
Uma outra forma de realizar acesso ao SAP é usando o recurso de pool de conexões. Através de uma API própria do JCo, é possivel controlar um pool de instâncias de conexões (O objeto Client) ao invés de criar uma a cada vez que precisar realizar um acesso ao SAP, cenário este que na web pode se tornar antiquado. A listagem abaixo mostra como isso é feito usando a estratégia de pool de conexões.
Neste modelo de programação, você pode fazer acesso simples as estruturas e informações de aplicações SAP R/3 tranquilamente. Mas conforme dito anteriormente, é possivel que o SAP possa realizar acesso a aplicações Java por meio do JCo também, cenário este que é mais adequado ao nosso cenário de integração, e também é um cenário comum para clientes do SAP, que desejam que quando eventos internos do SAP acontecerem, aplicações externas com maior poder de flexibilidade ou processamento possam executar as ações necessárias para tratar o evento de negócio.
Criando um JCo Server dentro do SAP para integrar com o JBoss ESB
Para que o SAP possa enviar mensagens para o JBoss ESB ou qualquer outro programa Java, é necessário que você implemente um skeleton em Java que faça o processamento do evento SAP/ABAP e realiza a conexão com outra aplicação Java. Neste caso, iremos criar uma solução que faça a interceptação do evento de consulta de clientes do SAP (notadamente a transação SE37) e mande o retorno da consulta para processamento do JBoss ESB, por exemplo, para envio da lista dos clientes por e-mail a um endereço pré-determinado.
Vamos começar criando o programa Java que atuará como gateway entre as camadas. A listagem abaixo mostra como será este programa principal que deverá estar sendo executado numa rede com acesso físico ao servidor do SAP.
Vejamos como funciona o trecho de código acima. Temos um programa Java que inicia a conexão com o SAP através da classe JCO.Server. Esta classe representa o componente SAP que atua como broker entre o SAP e aplicações Java, fazendo com que eventos internos do SAP possam ser processados por aplicações Java. Neste caso, é necessário que este componente saiba que estruturas do SAP acessar, e é ai que entre os elementos de repositório e meta-dados.
No bloco estático da classe, repare que é criado uma instância da classe de repositório personalizada que foi criada. Em seguinte, é feito o mapeamento das estruturas que serão lidas do SAP, a saber, o resultado da função RFC_CUSTOMER_GET, que retorna um conjunto de dados relacionados a clientes do SAP.
A classe que realiza toda a lógica relacionada ao processamento dos eventos é a classe estática Server, usada no método main() para iniciar a conexão com o SAP. Internamente nesta classe, existe o método handleRequest(JCO.Function function) que realiza efetivamente o recebimento do evento chamado, ou seja, a função SAP que foi executada, bem como os parâmetros de entrada a saída da função. Neste método, o que fizemos foi extrair os parâmetros de saída da função e popular um java.util.Map contendo as informações sobre os clientes retornados.
Depois de recuperado as informações dos clientes, nós enviamos os dados recuperados para o ESB, usando para isso o gateway do tipo JMS existente no JBoss ESB. Uma vez que os dados foram enviados para uma fila JMS monitorada pelo ESB, o resto do trabalho será feito exclusivamente pelo mesmo, e ai acaba o trabalho do gateway Java que criamos para o SAP. O único empencilho sobre esta abordagem de gateways usando JCo é que cada conjunto de dados a serem enviados para o ESB deve ter um programa Java que cuide disso, mas atente que o exemplo é meramente didático, a fim de mostrar como a API do JCo funciona. É possivel (e recomendável) que você tenha apenas um programa Java de gateway, que cuide de todos os eventos.
Como a API do JCo é muito flexível, é possivel criar um framework de interpretação de eventos que não seja um programa muito dificil de manter, uma vez que você pode lidar com N integrações com o SAP para N cenários diferentes, e este programa Java pode crescer absurdamente. Bem, agora que tratamos sobre o framework JCo, e já enviamos os dados para o ESB, agora é hora de ver como isso funciona internamente no JBoss ESB. Dúvidas sobre o JCo podem ser facilmente sanadas com as suas docs e samples que vem junto com o produto. Infelizmente, só que tem acesso ao SAP pode ter estas docs, mas se você está lendo este post, é porque provavelmente você está num projeto de integração do SAP com alguma coisa Java certo, logo, você já deverá ter acesso a isso.
Processando informações do SAP no JBoss ESB
Agora que temos os dados do SAP dentro de uma fila JMS monitorada pelo ESB, o processo é realmente simples, graças a simplicidade e poder que o JBoss ESB possui. Na listagem abaixo, temos um módulo do JBoss ESB cujo pipeline executa a transformação dos dados enviados pelo SAP para um objeto Java, em seguinte, transforma este objeto Java num arquivo texto e por último, envia um e-mail contendo o arquivo texto em anexo (resultado da integração com o SAP) para o endereço especificado, tudo isso, sem escrever nem uma linha de Java, apenas configurando parâmetros e opções.
Na listagem acima, repare que é feito a configuração de um provider do tipo JMS que irá receber a mensagem contendo o mapa de dados do SAP. Em seguida, o serviço "ClientesService" irá ouvir a chegada da mensagem na fila JMS mapeada para o canal e irá executar o pipeline de ações no padrão de troca de mensagens OneWay, ou seja, sem responsabilidade de retorno de mensagem para o emissor. As ações de transformação usam o mecanismo do Smooks para realizar as transformações de formatos, e é usado a ação personalizada Notifier do próprio JBoss ESB para fazer o envio do e-mail com o arquivo.
Boas Integrações ;-)
Uma outra forma de realizar acesso ao SAP é usando o recurso de pool de conexões. Através de uma API própria do JCo, é possivel controlar um pool de instâncias de conexões (O objeto Client) ao invés de criar uma a cada vez que precisar realizar um acesso ao SAP, cenário este que na web pode se tornar antiquado. A listagem abaixo mostra como isso é feito usando a estratégia de pool de conexões.
Neste modelo de programação, você pode fazer acesso simples as estruturas e informações de aplicações SAP R/3 tranquilamente. Mas conforme dito anteriormente, é possivel que o SAP possa realizar acesso a aplicações Java por meio do JCo também, cenário este que é mais adequado ao nosso cenário de integração, e também é um cenário comum para clientes do SAP, que desejam que quando eventos internos do SAP acontecerem, aplicações externas com maior poder de flexibilidade ou processamento possam executar as ações necessárias para tratar o evento de negócio.
Criando um JCo Server dentro do SAP para integrar com o JBoss ESB
Para que o SAP possa enviar mensagens para o JBoss ESB ou qualquer outro programa Java, é necessário que você implemente um skeleton em Java que faça o processamento do evento SAP/ABAP e realiza a conexão com outra aplicação Java. Neste caso, iremos criar uma solução que faça a interceptação do evento de consulta de clientes do SAP (notadamente a transação SE37) e mande o retorno da consulta para processamento do JBoss ESB, por exemplo, para envio da lista dos clientes por e-mail a um endereço pré-determinado.
Vamos começar criando o programa Java que atuará como gateway entre as camadas. A listagem abaixo mostra como será este programa principal que deverá estar sendo executado numa rede com acesso físico ao servidor do SAP.
Vejamos como funciona o trecho de código acima. Temos um programa Java que inicia a conexão com o SAP através da classe JCO.Server. Esta classe representa o componente SAP que atua como broker entre o SAP e aplicações Java, fazendo com que eventos internos do SAP possam ser processados por aplicações Java. Neste caso, é necessário que este componente saiba que estruturas do SAP acessar, e é ai que entre os elementos de repositório e meta-dados.
No bloco estático da classe, repare que é criado uma instância da classe de repositório personalizada que foi criada. Em seguinte, é feito o mapeamento das estruturas que serão lidas do SAP, a saber, o resultado da função RFC_CUSTOMER_GET, que retorna um conjunto de dados relacionados a clientes do SAP.
A classe que realiza toda a lógica relacionada ao processamento dos eventos é a classe estática Server, usada no método main() para iniciar a conexão com o SAP. Internamente nesta classe, existe o método handleRequest(JCO.Function function) que realiza efetivamente o recebimento do evento chamado, ou seja, a função SAP que foi executada, bem como os parâmetros de entrada a saída da função. Neste método, o que fizemos foi extrair os parâmetros de saída da função e popular um java.util.Map contendo as informações sobre os clientes retornados.
Depois de recuperado as informações dos clientes, nós enviamos os dados recuperados para o ESB, usando para isso o gateway do tipo JMS existente no JBoss ESB. Uma vez que os dados foram enviados para uma fila JMS monitorada pelo ESB, o resto do trabalho será feito exclusivamente pelo mesmo, e ai acaba o trabalho do gateway Java que criamos para o SAP. O único empencilho sobre esta abordagem de gateways usando JCo é que cada conjunto de dados a serem enviados para o ESB deve ter um programa Java que cuide disso, mas atente que o exemplo é meramente didático, a fim de mostrar como a API do JCo funciona. É possivel (e recomendável) que você tenha apenas um programa Java de gateway, que cuide de todos os eventos.
Como a API do JCo é muito flexível, é possivel criar um framework de interpretação de eventos que não seja um programa muito dificil de manter, uma vez que você pode lidar com N integrações com o SAP para N cenários diferentes, e este programa Java pode crescer absurdamente. Bem, agora que tratamos sobre o framework JCo, e já enviamos os dados para o ESB, agora é hora de ver como isso funciona internamente no JBoss ESB. Dúvidas sobre o JCo podem ser facilmente sanadas com as suas docs e samples que vem junto com o produto. Infelizmente, só que tem acesso ao SAP pode ter estas docs, mas se você está lendo este post, é porque provavelmente você está num projeto de integração do SAP com alguma coisa Java certo, logo, você já deverá ter acesso a isso.
Processando informações do SAP no JBoss ESB
Agora que temos os dados do SAP dentro de uma fila JMS monitorada pelo ESB, o processo é realmente simples, graças a simplicidade e poder que o JBoss ESB possui. Na listagem abaixo, temos um módulo do JBoss ESB cujo pipeline executa a transformação dos dados enviados pelo SAP para um objeto Java, em seguinte, transforma este objeto Java num arquivo texto e por último, envia um e-mail contendo o arquivo texto em anexo (resultado da integração com o SAP) para o endereço especificado, tudo isso, sem escrever nem uma linha de Java, apenas configurando parâmetros e opções.
Na listagem acima, repare que é feito a configuração de um provider do tipo JMS que irá receber a mensagem contendo o mapa de dados do SAP. Em seguida, o serviço "ClientesService" irá ouvir a chegada da mensagem na fila JMS mapeada para o canal e irá executar o pipeline de ações no padrão de troca de mensagens OneWay, ou seja, sem responsabilidade de retorno de mensagem para o emissor. As ações de transformação usam o mecanismo do Smooks para realizar as transformações de formatos, e é usado a ação personalizada Notifier do próprio JBoss ESB para fazer o envio do e-mail com o arquivo.
Boas Integrações ;-)