Pergunta

Dado um exemplo de chamar dois serviços métodos web a partir de um bean de sessão, que se uma exceção é lançada entre as chamadas para dois métodos? No caso de não chamar os serviços web da transação desmantelamento, e nenhum dano feito. No entanto, o serviço web não vai reverter. Claro que, mesmo com um único serviço de web há um problema. Embora esta seja uma pergunta genérica Estou interessado em soluções que têm a ver com beans de sessão EJB.

Um fácil e resposta personalizada seria adicionar um "método de reversão" especial para o serviço web para cada método de "funcionalidade real". O que estou pedindo é uma maneira padronizada para fazê-lo.

Foi útil?

Solução

Uma série de técnicas estão evoluindo, mas o problema ainda está suficientemente de vanguarda que o processo de normalização ainda não forneceu-nos com uma solução totalmente portátil.

Uma opção, você pode fazer a transação de serviços web conscientes. Isto, obviamente, pressupõe que você tenha controle sobre eles, embora escrevendo um proxy ciente da transação para serviços não-transacionais também é uma opção em alguns casos.

O protocolos WS-BA WS-AT e são os principais padrões para serviços web transacionais. Infelizmente, eles especificar apenas o protocolo, não as ligações de linguagem. Em outras palavras, não há nenhuma API padrão no nível de linguagem de programação. Para Java a coisa mais próxima é a JSR-156, mas não está pronto ainda.

Em seguida, o problema torna-se: como amarrar o (ou seja, JTA / XA) ??transação EJB para o WS. Uma vez que os modelos utilizados pelos protocolos WS-AT e XA estão intimamente relacionados, isto pode ser conseguido por meio de uma ponte de protocolo. Vários servidores de aplicação fornecem algo sozinho essas linhas. JBoss apresentado deles no JavaOne - veja http: //anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/txbridge/BOF-4182.odp

Note-se que o protocolo de ponte técnica também pode ser utilizada no sentido inverso, para permitir que um EJB que usos e.g. um XA backend de banco de dados, para ser exposto como um serviço web transacional.

No entanto, o modelo de bloqueio usado por duas fases transações é realmente adequado apenas para transações vida curta no mesmo domínio de controle. Se os seus serviços são executados na mesma empresa datacenter você provavelmente vai fugir com ele. Para uma distribuição mais ampla, seja geográfica ou administrativa, você provavelmente vai querer olhar para WS-BA, um protocolo web transações de serviços projetados especificamente para tal uso.

WS-BA usa um modelo baseado compensação que é mais difícil de programa. É essencialmente baseado na técnica que você menciona: o efeito de métodos de serviço é desfeita chamando um método de compensação. Isto pode ser complicado para obter direito, mas um estagiário JBoss fez um quadro anotação bastante agradável que permite que você defina métodos de compensação com o mínimo esforço e tê-los conduzido automaticamente. Não é padronizado, mas vale a pena conferir se você escolher essa abordagem: http: // www. jboss.org/jbosstm/baframework

Outras dicas

Web Services Coordenação (WS-C) e Web Services-Transação especificações (WS-T) desenvolvidos pela Microsoft, BEA Systems e IBM são usados ??em tais casos onde eu sei. Você pode começar a partir da leitura transações de serviços Web e Uma comparação de protocolos de transações de serviços web artigos fornecidos pela IBM para deixar claro.

Na verdade, você geralmente não precisa apenas de um método rollback costume, mas também um costume método commit. Caso contrário, você entrar em problemas como os encontrados no padrão WS-BA.

Basta verificar http://www.atomikos.com/Publications/TryCancelConfirm para um artigo detalhado. As características mencionadas não estão disponíveis em Atomikos ExtremeTransactions ... Esse produto também suporta o clássico 'ACID' transações de serviços web de estilo.

HTH

Guy

Disclaimer: Eu trabalho para Atomikos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top