Suporte ao Web Services Atomic Transaction no Servidor de Aplicativos
O suporte ao Web Services Atomic Transaction (WS-AT) no servidor de aplicativos fornece qualidade de serviço transacional ao ambiente de serviços da Web. Os aplicativos de serviço da Web distribuídos, e os recursos usados por eles, podem fazer parte de transações globais distribuídas.
- O WS-AT é um tipo de coordenação específica que define protocolos para transações atômicas. As especificações são:
- Web Services Coordination (WS-COOR) especifica CoordinationContext e um serviço de Registro com os quais os serviços da Web participantes podem se inscrever para fazer parte dos protocolos que são oferecidos por tipos de coordenação específicos. As especificações são:
- Web Services Coordination Versão 1.0
- Web Services Coordination Versão 1.1
- Web Services Coordination Versão 1.2
O suporte ao WS-AT é um protocolo de interoperabilidade que não introduz novas interfaces de programação para o suporte transacional. A demarcação da transação global é fornecida pelo uso do aplicativo corporativo padrão da interface UserTransaction JTA (Java™ Transaction API). Se um componente de aplicativo que está em execução sob uma transação global fizer uma solicitação de serviços da Web, um WS-AT CoordinationContext será propagado implicitamente para o serviço da Web de destino, mas apenas se os descritores de implementação do aplicativo apropriados tiverem sido configurados, conforme descrito no tópico sobre a configuração de atributos de implementação transacionais.
Se o servidor de aplicativos for o sistema hospedando o terminal de destino para uma solicitação de serviço da Web contendo WS-AT CoordinationContext, o servidor de aplicativos estabelecerá automaticamente uma transação JTA subordinada no ambiente de tempo de execução de destino que se tornará o contexto transacional sob o qual o aplicativo de serviço da Web de destino será executado.
A figura a seguir mostra um contexto de transação compartilhado entre dois servidores de aplicativos para uma solicitação de serviços da Web contendo um WS-AT CoordinationContext.

![[z/OS]](../images/ngzos.gif)
É possível configurar as políticas para o protocolo WS-AtomicTransaction. É possível configurar se um cliente propaga, e um servidor recebe, um contexto do WS-AT. Para assegurar que um cliente sempre envie o contexto do WS-AtomicTransaction quando fizer um pedido de serviço de saída, você deverá associar um conjunto de políticas ao cliente, no qual o conjunto de políticas deverá incluir o tipo de política WS-Transaction, e este tipo de política deverá ter uma configuração da WS-AtomicTransaction como Obrigatória. Como alternativa, se você souber que o cliente sempre chama os terminais remotos que incluem o atributo do tipo de política WS-AtomicTransaction ATAssertion, será possível configurar o cliente para aplicar a configuração da WS-Policy do provedor para que o cliente adote a política obrigatória do provedor automaticamente.
Para garantir que quaisquer solicitações recebidas pelo provedor de serviço da Web incluam um contexto WS-AtomicTransaction, você deve associar um conjunto de políticas ao provedor, em que o conjunto de políticas deve incluir o tipo de política WS-Transaction e este tipo de política deve ter uma configuração WS-AtomicTransaction igual a Obrigatória.
Para assegurar que um cliente ou provedor nunca utilize o contexto da WS-AtomicTransaction, você deverá associar um conjunto de políticas ao cliente ou ao provedor, no qual o conjunto de políticas incluirá o tipo de política WS-Transaction, e este tipo de política deverá ter uma configuração da WS-AtomicTransaction como Obrigatória. É possível usar essa configuração para ambientes nos quais não quer que solicitações de serviço da Web criem um forte acoplamento entre um cliente e um provedor, por exemplo, quando há solicitações entre empresas.
Se não houver nenhum conjunto de políticas associado a um cliente ou um provedor, ou o tipo de política WS-Transaction não estiver incluído no conjunto de políticas, o comportamento da WS-Transaction padrão será utilizado.
Restrições de Suporte ao WS-AT
Nessa versão do servidor de aplicativos, os contextos do WS-AT não poderão ser iniciados de um processo de cliente não recuperável.
Os pedidos do trabalho para a mesma transação do WS-AT enviados para um cluster de servidores não são garantidos para que sejam atribuídos ao mesmo membro de cluster todas as vezes.
Nesses casos, o trabalho
para uma transação pode ser manipulado por vários membros do cluster. Se o trabalho transacional de vários membros de cluster for disputado no mesmo recurso transacional, isso poderá resultar em uma condição de conflito.
Design do Aplicativo
O WS-AT é um protocolo de transação two-phase commit e é adequado apenas para transações de curta duração.
Uma transação atômica coordena os gerenciadores de recursos que isolam as atualizações transacionais suspendendo os bloqueios transacionais nos recursos. Portanto, geralmente não é recomendado que as transações WS-AT são distribuídas entre os domínios corporativos. As transações entre-empresas geralmente necessitam de uma semântica mais fraca do que um two-phase commit, e nesses cenários, pode ser mais apropriado usar uma transação de negócios de compensação, por exemplo, como parte de um Business Process Execution Language (BPEL) ou usar a Web Services Business Activity (WS-BA).
WS-AT é mais apropriado para o contexto de transação distribuída em serviços da Web que são implementados em uma única empresa. Somente os padrões de troca de mensagem pedido-resposta transportam o contexto da transação porque o originador (aplicativo ou contêiner) de uma transação deve estar certo de que todas as tarefas de negócios executadas sob esta transação foram concluídas antes de solicitar a conclusão de uma transação. Os serviços da Web chamados por um pedido de única via nunca são executados na transação do cliente solicitante.
O efeito de falhas de serviço em transações WS-AT é semelhante ao efeito de exceções do aplicativo EJB (Enterprise JavaBeans) em transações, conforme descrito na especificação do EJB. Se um serviço que está em execução sob uma transação WS-AT do solicitante retornar uma falha, o servidor de aplicativos não marcará automaticamente apenas a recuperação da transação. O manipulador de exceção do solicitante decide se a transação pode continuar e se deve ser marcada apenas como rollback. Se o solicitante estiver sendo executado no servidor de aplicativos, as APIs de JTA ou EJB padrão poderão ser utilizadas para marcar a transação apenas recuperação. O componente de serviço que gera a falha pode, ele mesmo, marcar a transação apenas recuperação antes de retornar a falha. Se a implementação do componente de serviço encontrar uma exceção do sistema, ela permitirá normalmente que seu contêiner trate da exceção. Os contêineres do servidor de aplicativos marcam automaticamente qualquer contexto de transação apenas recuperação recebido ao manipular uma exceção de sistema gerada por uma implementação do serviço.
Desenvolvimento de Aplicativo
Nenhuma tarefa de desenvolvimento específica é necessária para que aplicativos de serviço da Web sejam beneficiados por WS-AT.
Para aplicativos JAX-RPC, há alguns descritores de implementação de aplicativo que você deve configurar apropriadamente, conforme descrito no tópico sobre a configuração de atributos de implementação transacionais. O tempo de execução do JAX-RPC suporta o WS-AT 1.0.
Para aplicativos JAX-WS, ative o suporte WS-AT criando um conjunto de políticas, incluindo o tipo de política WS-Transaction no conjunto de políticas, configurando opcionalmente o tipo de política e anexando o conjunto de políticas ao aplicativo ou cliente que será envolvido na comunicação WS-AT. O tempo de execução JAX-WS suporta asserção WS-AT 1.0, WS-AT 1.1, WS-AT 1.2 e WS-Policy para WS-AT.
Quando o tempo de execução JAX-WS recebe uma solicitação de entrada, os níveis de especificação WS-Transaction 1.0, WS-Transaction 1.1 e WS-Transaction 1.2 são suportados. Quando um pedido do JAX-WS de saída é enviado, apenas um nível de especificação pode ser utilizado. Se as asserções WS-Transaction e WS-Policy estiverem disponíveis, a partir do Web Services Description Language (WSDL) do serviço da Web de destino, ou a partir do tipo de política WS-Transaction do cliente, o nível de especificação aplicável ao cliente e ao serviço da Web de destino será usado. Por exemplo, se o ambiente de hosting do serviço da Web de destino suportar apenas WS-Transaction 1.0, WS-AT 1.0 será usado. Se os dois níveis de especificação forem aplicáveis, ou se nenhuma asserção WS-Transaction WS-Policy estiver disponível, o nível de especificação WS-Transaction padrão definido nas configurações do serviço de Transação será utilizado.
- Para um cliente, se um cliente não considerar a política do provedor, o cliente não enviará nenhum contexto do WS-AT ou do WS-BB (Web Services Business Activity). Este comportamento é equivalente a uma configuração de política de WS-Transaction como Nunca.
- Para um cliente, se um cliente considerar a política do provedor, o cliente não enviará nenhum contexto do WS-AT ou do WS-BA se a política do provedor incluir asserções do WS-AT ou WS-BA. Este comportamento é equivalente a uma configuração de política de WS-Transaction como Suporte.
- Para um servidor, ele não recebe nenhum contexto WS-AT ou WS-BA. Este comportamento é equivalente a uma definição de configuração de política de WS-Transaction como Nunca.
Os desenvolvedores de aplicativos não precisam registrar explicitamente os participantes do WS-AT. O tempo de execução do servidor de aplicativos assume a responsabilidade pelo registro dos participantes do WS-AT, da mesma maneira que o registro do XAResources na transação do JTA para a qual a transação do WS-AT é federada. No tempo de conclusão da transação, todos os participantes do XAResources e do WS-AT são coordenados atomicamente pelo serviço de transação do servidor de aplicativos.
Se uma transação JTA estiver ativa no encadeamento quando a solicitação de aplicativo de serviço da Web for feita, a transação será propagada para a solicitação de serviços da Web e estabelecida no ambiente de destino. Este processo é similar à distribuição do contexto de transações pelo IIOP, conforme descrito na especificação do EJB. Qualquer trabalho transacional executado no ambiente de destino torna-se parte da mesma transação global.
Asserções de Política do WS-Transaction
Se você configurar as políticas para o protocolo WS-Transaction para um provedor, esta configuração afetará as asserções incluídas em qualquer WSDL gerado para o serviço da Web com o qual o tipo de política está associado. A asserção da WS-Policy utilizada para descrever os requisitos transacionais de um cliente ou provedor que usa o WS-AtomicTransaction é ATAssertion. Se o tipo de política de WS-Transaction tiver uma configuração de WS-AtomicTransaction como Obrigatória ou Suporte, uma asserção de política será incluída no WSDL.
O servidor de aplicativos também pode analisar, compreender e aplicar estas asserções que estão no WSDL que ele analisa.
O exemplo a seguir mostra o WSDL no qual WS-AtomicTransaction ATAssertion indica que um terminal deve ser chamado com o contexto do WS-AT incluído na mensagem de pedido, e que o contexto pode estar no formato WS-Transaction 1.0 ou 1.1. Há dois espaços de nomes e duas asserções: uma para cada nível de especificação do WS-Transaction, que usa o operador WS-Policy ExactlyOne para mostrar que o cliente deve escolher qual nível de especificação será usado.
<wsdl:definitions targetNamespace="bank.example.com"
xmlns:tns="bank.example.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsat11="http://docs.oasis-open.org/ws-tx/wsat/2006/06"
xmlns:wsat10="http://schemas.xmlsoap.org/ws/2004/10/wsat"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:Policy wsu:Id="ATPolicy">
<wsp:ExactlyOne>
<wsat11:ATAssertion />
<wsat10:ATAssertion />
<!-- omitted assertions -->
</wsp:ExactlyOne />
</wsp:Policy>
<!-- omitted elements -->
<wsdl:binding name="BankBinding" type="tns:BankPortType">
<!-- omitted elements -->
<wsdl:operation name="TransferFunds">
<wsp:PolicyReference URI="#ATPolicy" wsdl:required="true"/>
<!-- omitted elements -->
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>