Gostaria de fazer BIT (testes integrados) para vários servidores na minha nuvem. Preciso que a solicitação falhe em um grande tempo limite.
Como devo fazer isso com java?
Tentar algo como o abaixo não parece funcionar.
public class TestNodeAliveness {
public static NodeStatus nodeBIT(String elasticIP) throws ClientProtocolException, IOException {
HttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter("http.connection.timeout", 1);
HttpUriRequest request = new HttpGet("http://192.168.20.43");
HttpResponse response = client.execute(request);
System.out.println(response.toString());
return null;
}
public static void main(String[] args) throws ClientProtocolException, IOException {
nodeBIT("");
}
}
- EDITAR: Esclareça qual biblioteca está sendo usada -
Estou usando httpclient do apache, aqui está a seção relevante do pom.xml
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<type>jar</type>
</dependency>
java
http
timeout
network-protocols
Maxim Veksler
fonte
fonte
Respostas:
fonte
Se você estiver usando o cliente Http versão 4.3 ou superior, deverá usar este:
fonte
SocketTimeout
. Além disso, "default" significa que é padrão para tudo oHttpClient
que o métodoHttpClientBuilder
from create () fornecerá porbuild()
meio? Ou apenas os que passamsetDefaultRequestConfig(requestConfig)
? Estou fazendo sentido?HttpParams está obsoleto na nova biblioteca Apache HTTPClient. Usar o código fornecido por Laz leva a avisos de depreciação.
Sugiro usar RequestConfig em sua instância HttpGet ou HttpPost:
fonte
RequestConfig
em cadaHttpPost
em oposição a configurá-lo como padrão noHttpClient
?Parece que você está usando a API HttpClient, sobre a qual não sei nada, mas você poderia escrever algo semelhante a isso usando o núcleo do Java.
fonte
Achei que definir as configurações de tempo limite
HttpConnectionParams
eHttpConnectionManager
não resolveu nosso caso. Estamos limitados a usar aorg.apache.commons.httpclient
versão 3.0.1.Acabei usando um
java.util.concurrent.ExecutorService
para monitorar aHttpClient.executeMethod()
ligação.Aqui está um pequeno exemplo independente
fonte
O referido método com o mais alto da Laz está obsoleto da versão 4.3 em diante. Portanto, seria melhor usar o objeto Request Config e, em seguida, construir o cliente HTTP
O PoolingHttpClientConnectionManager é o usuário para definir o número máximo padrão de conexões e o número máximo de conexões por rota. Eu o defini como 306 e 108, respectivamente. Os valores padrão não serão suficientes para a maioria dos casos.
Para definir o tempo limite: usei o objeto RequestConfig. Você também pode definir a propriedade Tempo limite de solicitação de conexão para definir o tempo limite de espera de conexão do gerenciador de conexões.
fonte
Isso já foi mencionado em um comentário de Benvoliot acima. Mas, acho que vale a pena uma postagem de nível superior porque com certeza me deixou coçando a cabeça. Estou postando isso para o caso de ajudar alguém.
Eu escrevi um cliente de teste simples e o
CoreConnectionPNames.CONNECTION_TIMEOUT
tempo limite funciona perfeitamente nesse caso. A solicitação é cancelada se o servidor não responder.No entanto, dentro do código do servidor que eu estava tentando testar, o código idêntico nunca atinge o tempo limite.
Alterá-lo para expirar na atividade de conexão do soquete (
CoreConnectionPNames.SO_TIMEOUT
) em vez da conexão HTTP (CoreConnectionPNames.CONNECTION_TIMEOUT
) corrigiu o problema para mim.Além disso, leia os documentos do Apache com atenção: http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html#CONNECTION_TIMEOUT
Observe a parte que diz
Espero que isso salve alguém de todos os arranhões de cabeça pelos quais passei. Isso vai me ensinar a não ler a documentação completamente!
fonte
Op mais tarde declarou que estava usando o Apache Commons HttpClient 3.0.1
fonte
HttpConnectionParams.setSoTimeout(params, 10*60*1000);// for 10 mins i have set the timeout
Você também pode definir o tempo limite necessário.
fonte