Skip to content

Não, clientes (proxies) para serviços JAX-WS não são thread safe pela spec !

Setembro 10, 2013

Esse é um assunto recorrente em fóruns, e sempre vejo bastante besteira escrita a respeito. Definitivamente, pela especificação JAX-WS (página 57 do documento [1]), “client proxies” não são thread safe, ou seja, tome cuidado. Se criarmos um código cliente para acesso a um webservice, e armazenarmos nosso proxy (Interface para nosso serviço, refente ao javax.xml.ws.Service) em uma classe seguindo o pattern singleton, fatalmente teremos sérios problemas com acesso simultâneo. Óbvio que isso é especificação. Se um vendor fizer a implementação garantindo o acesso concorrente, então esqueça esse post =b.

Pensemos no seguinte exemplo …

Tenho um webservice (JAX-WS) implantado, publicando três métodos (operações) com distintos Beans de retorno. Algo como o trecho abaixo:

Imagem

 

 

Agora, supomos que o código cliente para invocar tal webservice utilize de um singleton para armazenar o proxy.

Imagem

 

Por fim, criamos então nosso código que irá utilizar o singleton acima, recuperando o nosso “service” (proxy), e então chamando na sequência seus três métodos:

Imagem 

Que bacana né? Agora efetue um teste de carga no método acima, e tenho certeza que você se alimentará de diversas exceções do tipo ClassCastException, como essa:

 

2013-09-09 19:39:04,363 ERROR [org.jboss.ws.core.CommonClient] (http-127.0.0.1-8080-3) Exception caught while (preparing for) performing the invocation:
java.lang.ClassCastException: org.rchies.GetCarResponse cannot be cast to org.rchies.GetHouseResponse
at org.rchies.GetHouseResponse$JaxbAccessorF__return.get(FieldAccessor_Ref.java:52)
at com.sun.xml.bind.v2.runtime.reflect.Accessor.getUnadapted(Accessor.java:147)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$7.get(JAXBContextImpl.java:958)

at org.jboss.ws.metadata.accessor.JAXBAccessor.get(JAXBAccessor.java:48)

 

“Poxa Rafael, isso acontece mesmo. Por quê?”

Como disse no título, e no decorrer deste post, a especificação JAX-WS não garante integridade no acesso concorrente ao proxy, que vem da classe javax.xml.ws.Service. Sendo assim, quando múltiplas threads fazem acesso a um único proxy, as respostas das requisições podem chegar em ordem invertida. Ou seja, o usuário A, que fez a pergunta A ao serviço, pode receber uma resposta B. Simplificando, a thread que chamou o método getCar(), devendo receber um objeto do tipo Car como retorno, pode receber um objeto do tipo House, que seria a resposta de outra thread. É exatamente isso que faz com que as exceções de ClassCast aconteçam.

Mas denovo, o não thread safe vem puramente da especificação. Se alguma implementação conter o controle de acesso concorrente, ai não teremos esse problema. Das implementações que conheço, sei que:

  • Apache CXF é Thread Safe nesse sentido
  • JBossws Native não é Thread Sage nesse sentido

Portanto, fiquem atentos quando utilizarem singletons para gerenciamento do lado cliente de uma requisição JAX-WS e, principalmente, sempre se previnam construindo testes de carga para aplicações com acesso simultâneo. 

O exemplo que mencionei nesse post está no meu github, é bem fácil de simular o problema em questão: https://github.com/rafachies/jaxws-demos/tree/master/wsthreadsafe

[1] – http://download.oracle.com/otndocs/jcp/jaxws-2_0-fr-eval-oth-JSpec/

From → Uncategorized

One Comment
  1. Reblogged this on JBossDivers and commented:
    Junte as suas notas qui… (opcional)

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

Coding Horror

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

InfoQ

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

JBoss Developer Recent Posts

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

JBossDivers

Mergulhando no Mundo JBoss

%d bloggers like this: