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.

Foi útil?

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

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