Criando um Aplicativo de Serviço da Web JAX-RPC que Usa Endereçamento de Serviço da Web

O Web Services Addressing (WS-Addressing) auxilia a interoperabilidade entre serviços da Web definindo uma forma padrão de endereçar serviços da Web e fornecer informações de endereçamento em mensagens. Essa tarefa descreve as etapas que são necessárias para criar um serviço da Web JAX-RPC que é acessado por meio de uma referência de terminal WS-Addressing. A tarefa também descreve as etapas extras que são necessárias para usar recursos stateful como parte do serviço da Web.

Antes de Iniciar

As etapas descritas nesta tarefa se aplicam os servidores e clientes que são executados no WebSphere Application Server.

Sobre Esta Tarefa

Complete essa tarefa se estiver criando um serviço da Web que usa a especificação WS-Addressing.

Procedimento

  1. Forneça uma interface de serviço da Web, criando ou gerando um documento Web Services Description Language (WSDL) para o serviço da Web, que retorna uma referência de terminal para o serviço de destino. A interface deve retornar uma referência de nó de extremidade, o que ela pode fazer utilizando uma operação de fábrica ou um serviço de fábrica separado. O serviço de destino pode enfrentar uma instância de recurso, por exemplo, um carrinho de compras.
  2. Implemente o serviço da Web criado na etapa anterior. Para a parte WS-Addressing da implementação, conclua as seguintes etapas:
    1. Crie uma referência de terminal que referencie o serviço da Web, seguindo as instruções emCriando Referências de Terminais Usando a API do Web Services Addressing Proprietária da IBM.
    2. Opcional: Se sua interface envolver um serviço da Web que enfrente uma instância de recurso, crie ou procure a instância de recurso.
    3. Opcional: Se estiver utilizando uma instância de recurso, obtenha o identificador do recurso e associe-o à referência de terminal como um parâmetro de referência por meio do uso do método EndpointReference.setReferenceParameter(QName resource_id_name, String value). O identificador de recurso depende do aplicativo e pode ser gerado durante a criação da instância de recurso.
      Atenção: Não coloque informações confidenciais no identificador de recurso, porque ele é propagado na mensagem SOAP.
      Agora, a referência de nó de extremidade destina o recurso.
    4. Retorne a referência de nó de extremidade.
  3. Se o serviço da Web usar instâncias de recurso, estenda a implementação para que corresponda a mensagens recebidas para as instâncias de recursos apropriadas. Como você associou o identificador de recurso à referência de terminal criada anteriormente, todas as mensagens que chegam destinadas nessa referência de terminal contêm as informações do identificador de recurso como um parâmetro de referência no cabeçalho SOAP da mensagem. Como o identificador de recurso é passado no cabeçalho SOAP, não é necessário expô-lo na interface de serviço da Web. Quando o WebSphere Application Server recebe a mensagem, ele coloca essas informações no contexto da mensagem no encadeamento. Estenda a implementação para executar as seguintes ações:
    1. Obtenha o identificador de instância de recurso do contexto da mensagem utilizando o método EndpointReferenceManager.getReferenceParameterFromMessageContext(QName resource_id_name).
    2. Redirecionar a mensagem para a instância de recurso apropriada.
  4. Para configurar um cliente para se comunicar com o serviço, utilize a referência de terminal produzida pelo serviço na primeira etapa para enviar mensagens para o terminal.
    1. Obtenha um objeto Stub (consultando o serviço no JNDI (Java™ Naming and Directory Interface)) ou crie um objeto Call vazio.
    2. Associe a referência de terminal ao objeto proxy. Utilize o método setProperty(String property_name, Object value) do objeto Stub ou Call. Utilize a constante do WS-Addressing WSADDRESSING_DESTINATION_EPR como o nome da propriedade e a referência de terminal como o valor.
      Esse procedimento configura automaticamente o objeto Stub ou Call, para representar o serviço da Web (ou instância de recurso se a sua interface usar um serviço da Web que esteja de frente com uma instância de recurso) da referência de terminal. Para os objetos Call, este processo inclui a configuração da interface e metadados de terminal (portType e elementos port) que estão associados à referência de terminal.
      Nota: Se os metadados da referência de terminal entrarem em conflito com as informações já associadas à mensagem de saída, por exemplo, se o objeto Stub estiver configurado para representar uma interface diferente, será emitida uma exceção javax.xml.rpc.JAXRPCException em tentativas de chamada do terminal.

    Chamadas no objeto Stub ou Call agora são marcadas como destino no serviço da Web ou instância do recurso que é definido pela referência de terminal. Quando ocorre uma chamada, o produto inclui propriedades adequadas de endereçamento de mensagem, como um parâmetro de referência contido na referência de terminal que identifica um recurso de destino, no cabeçalho da mensagem.

Resultados

O serviço da Web e o cliente são configurados para usar referências de terminal por meio do suporte ao WS-Addressing.

Fornecendo uma Interface de Serviço da Web que Retorna uma Referência de Terminal para o Serviço de Destino

Os seguintes exemplos correspondem às etapas 1 à 4 no procedimento. Os exemplos mostram como uma organização de TI pode usar os serviços da Web para gerenciar uma rede de impressoras. A organização pode representar cada impressora como um recurso que é endereçado por meio de uma referência de terminal. Os seguintes exemplos mostram como codificar tal serviço usando as interfaces de programação de aplicativos (APIs) do Web Services Addressing (WS-Addressing) de propriedade da IBM que são fornecidas pelo WebSphere Application Server e JAX-WS.

A organização de TI implementa um serviço PrinterFactory que oferece um elemento CreatePrinter portType. Esse elemento portType aceita uma mensagem CreatePrinterRequest para criar um recurso que representa uma impressora lógica e responde com uma referência ao terminal que é uma referência ao recurso.

A definição WSDL para esse serviço PrinterFactory pode incluir o seguinte código:
<wsdl:definitions targetNamespace="http://example.org/printer" ...
                  xmlns:pr=" http://example.org/printer">
  <wsdl:types>
    ...
    <xsd:schema...>
      <xsd:element name="CreatePrinterRequest"/>
      <xsd:element name="CreatePrinterResponse" 
                   type="wsa:EndpointReferenceType"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="CreatePrinterRequest">
    <wsdl:part name="CreatePrinterRequest" 
               element="pr:CreatePrinterRequest" />
  </wsdl:message>
  <wsdl:message name="CreatePrinterResponse">
    <wsdl:part name="CreatePrinterResponse" 
               element="pr:CreatePrinterResponse" />
  </wsdl:message>
  <wsdl:portType name="CreatePrinter">
    <wsdl:operation name="createPrinter">
      <wsdl:input name="CreatePrinterRequest" 
                  message="pr:CreatePrinterRequest" />
      <wsdl:output name="CreatePrinterResponse"
                  message="pr:CreatePrinterResponse" />
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

A operação CreatePrinter no exemplo anterior retorna um objeto wsa:EndpointReference que representa o recurso Printer criado recentemente. O cliente pode utilizar essa referência ao terminal para enviar mensagens para a instância de serviço que representa a impressora.

O método createPrinter mostrado no exemplo a seguir cria uma referência de terminal para o serviço Printer. A operação, então, obtém o identificador para a instância de recurso de impressora individual e a associa à referência ao terminal. Finalmente, o método createPrinter converte o objeto EndpointReference, que agora representa a nova impressora, em um objeto W3CEndpointReference, e retorna a referência de terminal convertida.

import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
import com.ibm.websphere.wsaddressing.EndpointReference;
import com.ibm.websphere.wsaddressing.jaxws.EndpointReferenceConverter;
import com.ibm.websphere.wsaddressing.jaxws.W3CEndpointReference;

import javax.xml.namespace.QName;

public class MyClass {

    // Criar a impressora
    ...

    // Definir o ID de recursos da impressora como uma constante estática conforme é requerida em etapas posteriores
    public static final QName PRINTER_ID_PARAM_QNAME = new QName("example.printersample",
                                                                 "IBM_WSRF_PRINTERID", "ws-rf-pr" ); 
    public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "..."); 
    public static final String PRINTER_ENDPOINT_NAME = new String("PrinterService");
    
    public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
    throws Exception {
     // Criar um EndpointReference que destina o URI do WebService apropriado e o nome da porta.
     EndpointReference epr =  EndpointReferenceManager.createEndpointReference(PRINTER_SERVICE_QNAME, 
                                                                               PRINTER_ENDPOINT_NAME);

     // Criar ou procurar o recurso com estado e derivar uma cadeia do
     // identificador de recursos.
     String resource_identifier = "...";

     // Associar esse identificador de recursos ao EndpointReference como  
     // um parâmetro de referência.
     // A opção de nome é arbitrária, mas deve ser exclusiva     
     // para o serviço.
     epr.setReferenceParameter(PRINTER_ID_PARAM_QNAME,resource_identifier);
     // A referência ao terminal, agora, destina o recurso em vez do serviço.
     ...

     return EndpointReferenceConverter.createW3CEndpointReference(epr);
    }
}

Por causa da implementação de serviços da Web descrita anteriormente, a instância de recurso da impressora tem um identificador exclusivo integrado à sua referência de terminal. Esse identificador torna-se um parâmetro de referência no cabeçalho SOAP de mensagens subsequentes destinadas no serviço da Web e pode ser usado pelo serviço da Web para corresponder a mensagens recebidas para a impressora apropriada.

Quando um serviço da Web recebe uma mensagem contendo propriedades de endereçamento de mensagens WS-Addressing, o WebSphere Application Server processa essas propriedades antes que a mensagem seja despachada para o terminal de aplicativo e as configura para o contexto de mensagem no encadeamento. O aplicativo de serviços da Web da Impressora acessa os parâmetros de referência associados ao terminal de destino do objeto WebServiceContext, conforme ilustrado no exemplo a seguir:

import com.ibm.websphere.wsaddressing.EndpointReferenceManager; 
...
 // Inicializar o nome do parâmetro de referência
 QName name = new QName(..);
 // Extrair o valor String.
 String resource_identifier = 
        EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);

A implementação de serviços da Web pode encaminhar mensagens com base na identidade da impressora adquirida do método getReferenceParameterFromMessageContext para as instâncias da impressora apropriadas.

O cliente cria um proxy JAX-WS para a impressora e converte o proxy em um objeto BindingProvider. O cliente então associa o objeto EndpointReference obtido anteriormente com o contexto de pedido do objeto BindingProvider, conforme ilustrado no exemplo a seguir.
import javax.xml.ws.BindingProvider;
...

 javax.xml.ws.Service service= ...;
 Printer myPrinterProxy = service.getPort(portName, Printer.class);
	
 javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider)myPrinterProxy;
	 
 // Recuperar o contexto de pedido para o objeto BindingProvider
 Map myMap = myBindingProvider.getRequestContext();  

 // Associar a referência de terminal que representa a nova impressora ao contexto de pedido 
 // para que o objeto BindingProvider agora represente uma instância de impressora específica.
 myMap.put(WSADDRESSING_DESTINATION_EPR, destinationEpr);

...
O objeto BindingProvider agora representa a nova instância de recurso da impressora e pode ser usado pelo cliente para enviar mensagens à impressora através do serviço da Web da Impressora. Quando o cliente chama o objeto BindingProvider, o WebSphere Application Server inclui propriedades de endereçamento de mensagem adequadas no cabeçalho da mensagem, que, nesse caso, é um parâmetro de referência contido na referência de terminal que identifica o recurso da impressora de destino.

Como alternativa, o cliente pode utilizar um objeto JAX-RPC de Stub ou Call, que o cliente configura para representar a nova impressora. O uso do objeto Call é ilustrado no exemplo a seguir.

import javax.xml.rpc.Call;
...
 :
 // Associar a referência ao terminal que representa a nova impressora à chamada.
 call.setProperty(
        "com.ibm.websphere.wsaddressing.WSAConstants.
                             WSADDRESSING_DESTINATION_EPR ", epr);

Da perspectiva do cliente, a referência de terminal é opaca. O cliente não pode interpretar o conteúdo de nenhum parâmetro de referência ao terminal e não deve tentar utilizá-los de maneira nenhuma. Os clientes não podem criar diretamente instâncias de referências de terminal porque os parâmetros de referência são privados para o fornecedor de serviços; os clientes devem obter referências de terminal do fornecedor de serviços, por exemplo, por meio de um serviço de factory de fornecedor e, então, usá-los para direcionar operações de serviços da Web para o terminal representado pela referência de terminal, como mostrado.

O que Fazer Depois


Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wsa_rap
Nome do arquivo: twbs_wsa_rap.html