Como posso definir um tempo limite contra um BufferedReader baseada em uma URLConnection em Java?

StackOverflow https://stackoverflow.com/questions/93357

  •  01-07-2019
  •  | 
  •  

Pergunta

eu quero ler o conteúdo de um URL, mas não quer "travar" se o URL não está respondendo. Eu criei um BufferedReader usando o URL ...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

... e então começou o loop para ler o conteúdo ...

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

... mas se os trava de leitura, em seguida, o aplicativo trava.

Existe uma maneira, sem moagem o código até o nível de socket, com "time out" a leitura, se necessário?

Foi útil?

Solução

Eu acho URLConnection.setReadTimeout é o que você está procurando.

Outras dicas

Se você tem java 1.4:

Presumo que o tempo limite de conexão (URLConnection.setConnectTimeout(int timeout)) é de nenhum uso porque você está fazendo algum tipo de streaming de.

--- Não mate o fio --- Ele pode causar problemas desconhecidos, descritores abertos, etc.

gerar um java.util.TimerTask onde você irá verificar se você tiver terminado o processo, caso contrário, perto da BufferedReader eo OutputStream do URLConnection

Inserir um isFinished sinalizador booleano e defini-lo como true no final do seu ciclo e para false antes do laço

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

Isto irá provavelmente causar uma IOException, então você tem que pegá-lo. A exceção não é uma coisa ruim em si. Eu estou omitindo algumas declarações (ou seja finais) para a classe anônima pode acessar suas variáveis. Se não, então criar um POJO que mantém uma referência e passar isso para o TimerTask

Desde Java 1.5, é possível definir o tempo limite de leitura em milissegundos no soquete subjacente através do 'setReadTimeout (timeout int)' método na classe URLConnection.

Note que há também a 'setConnectTimeout (timeout int)', que irá fazer a mesma coisa para a conexão inicial para o servidor remoto, por isso é importante definir que tão bem.

Tenho vindo a trabalhar sobre esta questão em um ambiente JVM 1.4 apenas recentemente. A resposta estoque é usar a propriedades do sistema sun.net.client.defaultReadTimeout (Leia timeout) e / ou sun.net.client.defaultConnectTimeout. Elas estão documentadas em Propriedades de Rede e lata ser configurado via o argumento -D na linha de comando Java ou através de uma chamada de método System.setProperty.

Supostamente estes são armazenados em cache pela implementação para que você não pode mudá-los de um lado para outro, de modo que eles são usados ??uma vez, os valores são mantidos.

Também eles não realmente trabalhar para conexões SSL ala HttpsURLConnection. Há outras maneiras de lidar com isso usando um SSLSocketFactory personalizado.

Mais uma vez, tudo isso se aplica a JVM 1.4.x. No 1.5 e acima, você tem mais métodos disponíveis para você na API (como observado por outros respondedores acima).

Para Java 1.4, você pode usar SimpleHttpConnectionManager.getConnectionWithTimeout (hostConf, connection_timeout) do Apache

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