1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

org.apache.commons.httpclient.HttpClient às vezes libera java.net.SocketException

Boa tarde caros membros do GUJ!

Estou a algum tempo enfrentando um problema que eu acredito ser relacionado a infra-estrutura, contudo eu ainda não tenho a certeza absoluta para afirmar isso. Então a possibilidade que falta é o problema estar na configuração da aplicação ou erro de logica e aqui estou em busca de sugestões ou se alguém aqui já passou por algo parecido!

Bom, sempre que finalizo um pedido no programa, precisamos fazer um XML, com esse trecho:

Requisicao requisicao = new Requisicao(this.ec, this.destino);
return requisicao.enviarMensagem(mensagem);

Então dentro da classe Requisicao, em alguns momentos, eu recebo uma exceção do tipo java.net.SocketException: Software caused connection abort: recv failed. Aqui esta a classe, eu retirei alguns trechos relacionados a regras de negócio que poderiam ser desnecessários:

public class Requisicao {

    private String destino;
    private Pedido pedido;
    private static HttpClient httpClient = new HttpClient();
    private static final Logger logger = Logger.getLogger(Requisicao.class);

    static{
        httpClient.setHttpConnectionManager(new MultiThreadedHttpConnectionManager());
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(60000);
        httpClient.getHttpConnectionManager().getParams().setSoTimeout(60000);
    }

    protected Requisicao(Pedido p, String destino){
        this.p = p;
        this.destino = destino;
    }

    public RespostaVO enviarMensagem(Mensagem mensagem) throws FalhaComunicaoException, RequisicaoInvalidaException{
        mensagem.setPedido(this.p);
        String mensagemXml = mensagem.toXml(); // neste ponto eu transformo o objeto no XML que será enviado
        PostMethod httpMethod = new PostMethod(this.destino);
        httpMethod.addParameter("mensagem", mensagemXml);
        try{
            httpClient.executeMethod(httpMethod);
            String respostaXml = httpMethod.getResponseBodyAsString();
            // vou omitir alguns trechos desnecessários, incluindo o return
        }catch (HttpRecoverableException e){
            throw new FalhaComunicaoException(e.getMessage());
        }catch (HttpException e){
            throw new FalhaComunicaoException(e.getMessage());
        }catch (NoHttpResponseException e){
            throw new FalhaComunicaoException(e.getMessage());
        }catch (ConnectionPoolTimeoutException e){
            throw new FalhaComunicaoException(e.getMessage());
        }catch (ConnectTimeoutException e){
            throw new FalhaComunicaoException(e.getMessage());
        }catch (IOException e){
            logger.error("Houve uma falha de comunicação do tipo IOException (especificamente "+e.getClass().getName()+"): "+e.getMessage(), e);
            throw new FalhaComunicaoException(e.getMessage());
        }finally{
            httpMethod.releaseConnection();
        }
    }
}

As vezes o programa dispara um erro ao executar o comando httpClient.executeMethod(httpMethod); e essa é a exceção que obtemos.

[ERROR] 2015/05/06 15:32:27 Requisicao.enviarMensagem - Houve uma falha de comunicação do tipo IOException (especificamente java.net.SocketException): Software caused connection abort: recv failed
java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
    at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
    at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413)
    at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
    at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
    at test.Requisicao.enviarMensagem(Requisicao.java:66)

O que dificulta é: nunca consegui reproduzir esse erro em ambiente de desenvolvimento, porém segue uma lista do que eu sei:

  • As transações com erro, nem ao menos chegam no destino;
  • A internet no momento da transação estava operando e sem problemas, existem outros programas que rodam na maquina e funcionam normalmente;
  • Utilizamos ambiente Windows;
  • Utilizamos o Java 1.7.0_67-b01;
  • Utilizamos a HttpClient 3.1;
  • O XML gerado e atribuído para mensagemXml sempre esta de acordo com o padrão, em questão de variáveis e tamanho;
  • As transações com erro não possuem carateristas especiais ou diferente das demais transações que tiveram sucesso.

A minha duvida é: Alguém tem alguma dica para solucionar esse problema? Ou já passou por isso?

Agradeço a todos a atenção!

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java apache ou faça a sua própria pergunta.