estou com um problema num sistema meu aqui, nós temos um serviço Rest que recebe um alto número de requisições e está muito lento o processamento na hora do rush, basicamente minha arquitetura é essa:
RequestWS > UsuarioService > UsuarioDAO
O UsuarioService é singleton, ele contem as regras de negócio da aplicação, basicamente validação, não contem comportamento…
O que tenho de debug é chega a requisição no RequestWS em 00:00:00 e o evento chega em UsuarioService em 00:00:58, ou seja, tem casos que demora mais de 50segundos pra passar uma chamado e antes disso não faz validaçao NENHUMA, ZERO mesmo.
Como pode uma uma simples chamada de uma classe pra outra demorar esse tempo todo?
Essa classe UsuarioService sendo singleton pode gerar gargalo em função da quantidade de request?
Não tem nenhum motivo para a classe ser o gargalo POR SER SINGLETON.
Creio que vc esteja supondo que as chamadas ao método de serviço ficarão enfileiradas à espera de serem executadas, mas não se preocupe isso não acontece.
A NÃO SER QUE… os métodos sejam synchronized. Nesse caso qualquer demora no processamento, acesso ao banco de dados, etc. vai fazer com que as outras chamadas fiquem esperando antes de entrar no método de serviço.
[quote=saoj]Checa se tem alguma sincronizacao em algum lugar. Vc pode estar serializando os requests sem saber…
[/quote]
Basicamente meu serviço todo se consiste disso:
UsuarioWS
//Meu web service endpoint
@WebService
public class UsuarioWS {
public String adicionarUsuario(String xmlRequest) {
try {
// Ex: o evento chega aqui em 00:00:00hs
Usuario userReq = Util.converterXMLUsuario(xmlRequest);
//singleton usuarioService
return usuarioService.adicionarUsuario(userReq);
}
//vários catchs
}
}
UsuarioService
public class UsuarioService{
public String adicionarUsuario(Usuario user) {
try {
validaCamposObrigatorios(user);
// o evento chega aqui em 00:00:50
usuarioDAO.adicionar(user);
}
//vários catchs
}
}
Eu nunca tive problema com WS, e trabalho da mesma forma que vc, exceto que meus métodos não recebem um XML e sim um Objeto, no seu caso usuário, deixando a transformação do XML -> Objeto para o JAXB(o próprio servidor faz isso).
Vc pode testar chamar o Util.converterXMLUsuario() passando um XML criado manualmente para verificar o tempo de execução, e também ver o desempenho do mesmo parse quando usado JAXB.