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.
Download

JAXM API EM REDE PONTO-A-PONTO