JAVA API FOR XML MESSAGING “JAXM API EM REDE PONTO-A-PONTO” Daniela Medeiros Cedro Viviane Maria da Conceição de Souza Hélio Augusto Sabóia Moura [email protected] [email protected] [email protected] Faculdade Lourenço Filho Resumo: Esse trabalho apresenta a utilização do JAXM num modelo de rede ponto-a-ponto, bem como a utilização do SOAP para envio e recebimento de mensagens. Além disto, ele discute a utilização da API JAXM. Será mostrado de maneira sucinta como se criar um SOAP Message e alguns códigos fontes testados. Será enfatizado, também, como a API Java, para mensagens em XML, colabora na criação de aplicações de mensagens negócio-a-negócio usando o XML. Palavras Chaves: SOAP, XML, API, Message Sender, Message Exchange, Message Receiver. Abstract: This work presents the use of JAXM in a model of a point-to-point network, as well as the use of SOAP for sending and reception of messages. Besides discussing API JAXM'S use, it will be shown in a brief way as creating a SOAP Message and some codes sources tested. We emphasize also how does API Java messages in XML collaborate in the creation of applications of messages business-to-business using XML. Key-Words: SOAP, XML, API, Message Sender, Message Exchange, Message Receiver. Introdução Investindo na implementação de uma nova tecnologia em Web Services denominada SOAP - Simple Object Access Protocol (Protocolo de Acesso Simples a Objetos), a Empresa Sun, com aprovação da JCP (Comunidade Java), lançou pacotes JAXs em 12 de novembro de 2001, dentre eles o JAXM, que foi desenvolvido com a missão de fornecer um protocolo SOAP através de um API para Java. Esse pacote permite, de uma forma padrão, a emissão de mensagens originadas do XML pela Internet sobre uma plataforma Java. JAXM pode ser estendido para trabalhar com os protocolos do messaging de um nível mais elevado, tais como o serviço de mensagem do ebXML (negócio eletrônico XML), adicionando a funcionalidade do protocolo no alto do SOAP. 28 Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 Uma aplicação em JAXM pode ser desenvolvida em J2EE 1.3 ou em Servlet 2.2. O corpo pode ser sinais digitais se suportado pelo “profile” em uso. A seguir serão expostas algumas definições da API JAXM para que o leitor possa ter uma maior compreensão do tema deste artigo: “JAXM API em Rede Ponto-a-Ponto”. Na Seção 2 será apresentada a definição tecnológica da API, bem como sua composição e os elementos funcionais. Na Seção 3 será apresentado o modelo conceitual do JAXM descrevendo como se dá o envio e a recepção de mensagens. Durante a Seção 4, descreveremos como é realizado o procedimento de criação de uma SOAPMessage que é base da tecnologia API JAXM. A Seção 5 descreve como é feito o envio de mensagem utilizando métodos do SoapConecction. Em seguida iremos abordar na Seção 6 como é a estrutura de uma rede Ponto a Ponto através do JAXM. O que é JAXM? O JAXM é uma tecnologia Java que suporta o envio e o recebimento de mensagens baseada em SOAP e em protocolos de comunicações XML. Alguns autores gostam de definir o JAXM como um conjunto de APIs para manipular envelopes SOAP e transportá-los sobre HTML, SMTP ou outros protocolos. Esta API é composta de dois pacotes principais: ü javax.xml.soap : é definida dentro da especificação SOAP with Attachments API for JAVA (SAAJ) e constitui a base das trocas de mensagens SOAP, contém, também, a API destinada a criar uma mensagem SOAP. Esse pacote contém todas as API’s necessárias para enviar mensagens do tipo pedidos/ respostas. ü javax.xml.messaging : é definido dentro da especificação JAXM 1.1. Esse pacote contém API’s necessárias para utilizar um fornecedor de mensagem, e também para enviar as mensagens em “one-way”. O segundo pacote depende do primeiro. Assim um cliente envia suas mensagens pedidos/respostas completamente compatíveis com a API. Para melhor entender o conceito, pode-se dividir esta tecnologia em quatro elementos funcionais: ü ü ü ü A mensagem; O remetente da mensagem; O receptor da mensagem; A troca da mensagem. Na figura 1 são apresentados os quatro elementos cobertos pelo JAXM. Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 Remetente da Mensagem Mensagem Troca de Mensagem 29 Receptor da Mensagem Figura 1 - Elementos Funcionais Conforme [Rodoni 4], para permitir colaboradores de escrever as aplicações que usam o messaging de XML, JAXM fornece os elementos múltiplos que trabalham junto para fornecer a facilidade do messaging. A tabela abaixo traça as várias etapas do messaging de XML e da funcionalidade introduzida por JAXM. Tabela 1 - Traçando a funcionalidade do Messaging XML e JAXM Messaging XML Mensagem Elementos Funcionais de JAXM Mensagens de JAXM Cliente autônomo de JAXM ou cliente de JAXM usando um Remetente da mensagem fornecedor Receptor da mensagem Serviço de JAXM Troca da mensagem Troca da mensagem de JAXM Modelo Conceitual O JAXM apresenta um modelo conceitual muito simples de se compreender. Na figura 2 é mostrada uma relação entre o JAXM e outros elementos necessários em um envio de uma mensagem WEB Os cenários de envio de mensagem utilizando a API JAXM podem ser síncronos ou assíncronos. A utilização da API se divide em cinco categorias importantes e todas são implementadas dependendo do estilo de interações. 30 Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 Figura 2 - Modelo Conceitual Quando nós enviamos uma mensagem e clicamos na opção “enviar”, nós utilizamos um Provedor JAXM/Cliente emparelhando uma linha de produção de mensagens e ao mesmo tempo o Provedor Cliente que se refere ao “receber” possui a função de consumidor de mensagens. Enviar Receber Mensagem (pedido) Lendo Pedido Outro Processamento Mensagem (resposta) Processando Resposta Figura 3 - Envio e recebimento de mensagens Na figura 3 é representada uma cena em que a recepção de uma mensagem se denota com sucesso a conclusão de um pedido precedente. Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 31 Criando uma Mensagem SOAP SOAP é um protocolo padrão baseado em XML que tem como função enviar/receber mensagens. Ele pode ser usado como protocolo RPC, apesar de não o ser. O transporte das mensagens pode ser realizado através do HTML, SMTP e equivalentes e elas podem conter tanto textos como bytes etc. A estrutura do SOAP é dividida da seguinte forma: Ø Envelope ü Header ü Body Envelope Header Body Documento (“Payload”) Fault Figura 4 - Estrutura SOAP Exemplo 1: <soap-env:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:Header/> <soap-env:Body> <cal:schedule xmlns:cal="http://www.example.com/calendar"> <cal:newitem> <cal:eventDate>4/10/2002</cal:eventDate> <cal:title>Fun With Frogs</cal:title> </cal:newitem> </cal:schedule> </soap-env:Body> </soap-env:Envelope> Neste exemplo, o Header permanece vazio e Body contém informações destinadas a uma aplicação de calendário. Este exemplo nos dá uma noção geral do SOAP, com base nisto podemos partir para a criação de um SOAPMessage. 32 Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 Uma SoapMessage pode ser criada através de um MessageFactory (fábrica de mensagens). O MessageFactory pode ser criado usando o método estático chamado MessageFactory.newInstance(). Exemplo 2: // Create a message factory. MessageFactory mf = MessageFactory.newInstance(); // Create a new messsage from the message factory SOAPMessage message = mf.createMessage(); // Get SOAP Part from the message. SOAPPart soapPart = message.getSOAPPart(); Enviando mensagens Como já vimos anteriormente, a criação de uma mensagem se dá a partir MessageFactory e que esta pode conter textos, mensagens etc. do As mensagens podem ser emitidas diretamente usando um SoapConnection, ou indiretamente usando uma fábrica de mensagem. Iremos utilizar alguns exemplos do artigo de Nicholas Chase, presidente da Chase and Chase, Inc; Java API automatiza várias das etapas requeridas na geração e envio de mensagens manualmente. Entre suas citações ele escreve que o Java API para XML Message (JAXM) simplifica o processo de criação e emissão de SoapMessage. Vejamos, agora o exemplo da criação de um objeto “Message”. Exemplo 1: // Bibliotecas import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap.SOAPConnection; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPBody; public class SOAPTip { Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 33 public static void main(String args[]) { try { //Aqui é criado a conexão SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnFactory.createConnection(); //Agora é criado a messagem atual MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage message = messageFactory.createMessage(); //Cria objetos para as partes da SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody body = envelope.getBody(); //Fecha a conexão connection.close(); } catch(Exception e) { System.out.println(e.getMessage()); }}} A mensagem real é emitida usando um método conhecido: “call()”. Este faz a verificação da mensagem e do destino e retorna um segundo SoapMessage com a resposta. O destino deve ser um objeto EndPoint ou um URLEndPoint. A seguir temos um código fonte, onde poderemos enviar as mensagens criadas anteriormente. ... import javax.xml.messaging.URLEndpoint; public class SOAPTip { public static void main(String args[]) { ... //Verificação da entrada System.out.println("\nREQUEST:\n"); message.writeTo(System.out); System.out.println(); 34 Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 // Emite a mensagem e inicia o envio da resposta //Indica o destino URLEndpoint destination = new URLEndpoint("http://localhost:8080/jaxm-simple/receiver"); //Envia a mensagem SOAPMessage reply = connection.call(message, destination); //Fecha a conexão connection.close(); ... }} Conexão Ponto a Ponto As seções anteriores foram de grande importância para chegarmos a este ponto. Foi mostrado como se cria uma mensagem SOAP, bem como se processa o envio de mensagens, além de ter sido destacada a definição teórica da API em questão. A partir deste momento será abordada a realização de uma Conexão Ponto a Ponto. Uma conexão Ponto a Ponto nada mais é que uma estrutura simples de rede sem a utilização de um servidor. Cada computador tem acesso a pastas públicas de todos os outros. Esse tipo de conexão, também conhecida como Standalone Message, é simples de se criar, bem como de se utilizar. Cada máquina envia e recebe mensagens através da API JAXM. Utiliza-se um objeto SOAPConnection que possui como uma de suas vantagens a não necessidade de configuração para poder utilizá-lo[7]. O método utilizado para emitir mensagens de um ponto a outro é o ‘’call’’. Este método faz parte de um objeto do endpoint que especifica o destino de onde a mensagem deve ser emitida [6]. A tabela a seguir destaca os métodos utilizados pelo SoapConnection, bem como suas respectivas descrições: Tabela 2: Sumário de Métodos Método abstract SOAPMessage abstract void Descrição call (SOAPMessage request, Endpoint endpoint) Emite a mensagem dada ao endpoint e aos blocos especificados até que retorne a resposta. close() Closes this SOAPConnection object. Static NewInstance() SOAPConnection Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 35 Podemos citar os métodos herdados de classes que também são utilizados para a conexão PTP (Point-to-Point), tais como: clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Todas as conexões (Standalone Message ou Provider) JAXM são criadas por uma fábrica da conexão. Um objeto de SOAPConnection, a fábrica é um objeto de SOAPConnectionFactory. Um cliente (micro que envia a mensagem) obtém a execução chamando a seguinte linha do código SOAPConnectionFactory, bem com a fábrica (micro que recebe a mensagem) que obtém a execução da seguinte forma: SOAPConnectionFactory = SOAPConnectionFactory.newInstance(); Para melhor compreensão, destacaremos alguns tópicos e exemplificaremos como é realizada a conexão Ponto a Ponto através do API JAXM. O Modelo: Ø Interação Pedido-Resposta (Request-response) Ø Conexão estabelecida diretamente ao receptor final. Figura 5 - Modelo Standalone Message O Construtor: Public SoapConnection(); 36 Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 Métodos Detalhados Call public abstract SOAPMessage call(SOAPMessage request, Endpoint endpoint) throws SOAPException Esta linha de código tem a função de emitir a mensagem dada ao endpoint e aos blocos especificados até que retorne uma resposta. Observe que o método call emite um objeto de SoapMessage e indica o destino da mensagem. Veja a seguir a descrição dos parâmetros utilizados pelo método: Ø Parâmetros: request - objeto de SOAPMessage a ser emitido endpoint - identifica onde a mensagem deve ser emitida. Ø Throws: SOAPException – se houver um erro do SOAP. Close public abstract void close() throws SOAPException Este método fecha o objeto SoapConnection. Throws: SOAPException – se houver um erro do SOAP. newInstance public static SOAPConnection newInstance() throws SOAPException Considerações Finais Quando ouvimos falar sobre o aparecimento de alguma nova tecnologia Java, podemos ter a certeza de que esta veio para inovar a programação em termos de facilidade e eficiência. Com os pacotes JAX’s desenvolvidos pela SUN para o envio de mensagens XML não poderia ser diferente. Desenvolvidos com o intuito de inovar a implementação em Web Service, eles vêm sendo utilizados por pesquisadores e profissionais em todo mundo. Rev. Cient. Fac. Lourenço Filho - v.3, n.1, 2003 37 Nesse artigo destacamos o JAXM - Java Api for Xml Messaging (Java Api para Mensagens XML) e seus recursos para o tipo de Conexão Ponto a Ponto. Discutimos a teoria e exemplificamos os métodos, a criação de SOAP’s, bem como o envio das mensagens XML. Após exibir conceitos importantes que englobam o API JAXM, apresentamos como é realizada uma conexão Ponto a Ponto utilizando esta tecnologia Java. A elaboração desse artigo contribui para o fortalecimento da utilização das tecnologias Java entre os estudantes universitários, programadores, pesquisadores profissionais de informática. Referências Bibliográficas [1] NICHOLAS, Chase.“Java API automates many of the steps required in generating and sending messages manually” – Artigo – Abril/2002 ([email protected]). [2] ROCHA, Helder. “Java e XML” – Palestra: Como implementar Web Services em Java – Argonavis, 2002. [3] RIMA, Patel Sriganesh. “XML Messanging using JAXM” – Apresentação – Sun Microsystems, 2002. [4] RODONI, Jennufer. “Introdução ao Modelo de Programação do Cliente JAXM” – Artigo Científico – SOL Microsystems, 2002. [5] SMADJA, Olivier. “XML e Web Services” – Tutorial – Jconcept. [6] www.systinet.com/doc/wasp_jserver/api/javax/xml/soap/SOAPConnection.html. [7] www.cosc.canterbury.ac.nz/resources/java/documentation/java-xml/java_xml_packwinter-01-dev/docs/tutorial/doc/JAXM3.html. [8] java.sun.com/j2ee/1.4/docs/api/javax/xml/soap/SOAPConnection.html. [9] planetexml.com. [10] sern.ucalgary.ca/courses/SENG/513/F2001/slides/JAXM.ppt.