Eixo trava de serviços web, porque nenhuma conexão de perto é devolvido
-
06-07-2019 - |
Pergunta
Eu tenho um cliente de serviço Web Axis 1.4 (com mola) consumir um serviço de web PHP (em execução no Apache). Isso funciona perfeitamente no ambiente de desenvolvimento, mas no ambiente de produção o código de trava de execução em algum lugar na biblioteca Axis diretamente depois que o cliente recebeu a resposta SOAP. Eu identifiquei com Wireshark que a única diferença a partir da perspectiva do cliente é que no ambiente de desenvolvimento do cabeçalho HTTP do SABÃO Response contém a entrada
Connection: close
que está faltando no ambiente de produção. Minha suposição é que esta é a razão pela qual os trava execução de código, porque Axis está esperando o próximo campo de cabeçalho de conexão.
Existe algo que eu possa fazer para remediar esta situação, configurando o cliente? Se não, alguma dica para configurar o Apache + PHP para fechar a conexão corretamente são apreciados.
Solução
Tente configurar a propriedade do sistema -Dhttp.keepAlive = false na sua aplicação, se pode pagar incapacitante alives Tenha em outras partes do aplicativo. Isso vai evitar que certos trava com a classe HttpClient java-interno tentando ansiosamente preencher uma BufferedInputStream da conexão aberta.
Para mais detalhes veja também http://bugs.sun.com/bugdatabase /view_bug.do?bug_id=4479751 .
Se isto tem a chance de ajudar você a ter um olhar para o rastreamento de pilha de seu cliente de suspensão, ele deve ser parecido com isto:
java.lang.Thread.State: RUNNABLE em java.net.SocketInputStream.socketRead0 (Método Nativo) em java.net.SocketInputStream.read (SocketInputStream.java:129) em java.io.BufferedInputStream.fill (BufferedInputStream.java:218) em java.io.BufferedInputStream.read1 (BufferedInputStream.java:258) em java.io.BufferedInputStream.read (BufferedInputStream.java:317) - bloqueado <0xab82fa30> (a java.io.BufferedInputStream) em sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:687) em sun.net.www.http.HttpClient.parseHTTP (HttpClient.java:632) em sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1072) - bloqueado <0xab82c838> (a sun.net.www.protocol.http.HttpURLConnection)
O http.keepAlive definindo essencialmente garante que o HttpClient será sempre enviar uma 'conexão: fechar'. Como sugerido por HeavyWave
Outras dicas
Você pode tentar enviar cabeçalho HTTP "Connection: close". Com o seu pedido