Pergunta

Eu gostaria de saber a melhor maneira correta / a concorrência punho com um webservice Axis2.

Por exemplo, dado este código:

public class MyServiceDelegate
{
    @Resource
    UserWebService service; // Injected by spring

    public CustomerDTO getCustomer()
    {
       String sessionString = getSessionStringFromCookies();
       service.setJSESSIONID(sessionString);
       CustomerDTO customer = service.getCustomerFromSessionID();
    }
}

Note que no exemplo acima que UserWebService é uma festa de 3 API. O serviço requer que ao fazer chamadas, passamos um cookie com o JSESSIONID de uma sessão autenticada.

Am I correto em assumir que esta afirmação não é threadsafe? IE., Dadas duas linhas, é possível para o seguinte para ocorrer?

  • ThreadA: service.setJSESSIONID("threadA")
  • ThreadB: service.setJSESSIONID("threadB")
  • ThreadA: service.getCustomerFromSessionID // service.sesionID == "threadB"

Se sim, qual é a forma mais adequada de lidar com esta situação? Devo usar um pool de recursos para o serviço? Ou devo declarar serviço como sincronizado?

    public CustomerDTO getCustomer()
    {
       synchronized( service ) {
          service.setJSESSIONID(sessionString);
          CustomerDTO customer = service.getCustomerFromSessionID();
       }
    }

Ou, existe outra maneira, mais apropriado para lidar com este problema?

Foi útil?

Solução

Será que cada fio tem seu próprio objeto delegado e, portanto, seu próprio serviço UserWebService?

No caso simples, se os delegados são criados na pilha dos fios seria independente.

Se o custo de criação é alta, tem uma piscina dos objetos delegados. Tomando um de teh piscina é barato comparativley. Você precisa ter muito cuidado com limpeza, mas efetivamente este é o que é feito com conexões de banco de dados. Alguns ambientes têm classes de utilitários para gerenciar tais pooling -. Tende a ser preferível a rolar seus próprios

Outras dicas

é UserWebService uma das suas aulas? Se assim for, eu acho que eu iria alterar a assinatura do método para:

public CustomerDTO getCustomer()
{
      CustomerDTO customer = service.getCustomerFromSessionID(sessionString);
}

E não tem o seu UserWebService manter o estado, de que maneira ele será inerentemente thread-safe

Como você disse, a função não é thread-safe. Java tem uma maneira simples de fazer monitores, que é um objeto que só permite que um segmento para o acesso uma função de cada vez. Mais informações sobre monitores

Para tornar o segmento de seguros você pode colocar sincronizado, quer, como você fez, em torno da expressão, ou antes o nome da função:

public synchronized CustomerDTO getCustomer(){
    service.setJSESSIONID(sessionString);
    CustomerDTO customer = service.getCustomerFromSessionID();
}

A diferença entre os dois é que o objeto que você se transformar em um monitor.

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