Я обнаружил, что установка параметров тайм-аута в HttpConnectionParams
и HttpConnectionManager
не решила наш случай. Мы ограничены использованием org.apache.commons.httpclient
версии 3.0.1.
В итоге я использовал java.util.concurrent.ExecutorService
для мониторинга вызова HttpClient.executeMethod()
.
Вот маленький, самостоятельный пример
<code>import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;
/**
* @author Jeff Kirby
* @since <pre>Jun 17, 2011
* /
public class Example {
private static final String SITE = "
http://some.website.com/upload";
приватная статическая финал int TIME_OUT_SECS = 5;
// загрузить файл и вернуть ответ в виде строки
Публичная строка (файл файла) выдает IOException, InterruptedException {
final Part [] multiPart = {new FilePart ("file", file.getName (), file)};
final EntityEnclosingMethod post = new PostMethod (SITE);
post.setRequestEntity (new MultipartRequestEntity (multiPart, post.getParams ()));
final ExecutorService executor = Executors.newSingleThreadExecutor ();
окончательный список > futures = executor.invokeAll (Arrays.asList (new KillableHttpClient (post)), TIME_OUT_SECS, TimeUnit.SECONDS);
executor.shutdown ();
if (futures.get (0) .isCancelled ()) {
сгенерировать новое IOException (истекло время ожидания SITE +. Для ответа потребовалось более «+ TIME_OUT_SECS +« секунд »);
}
return post.getResponseBodyAsString ();
}
закрытый статический класс KillableHttpClient реализует Callable {
закрытый финальный пост EntityEnclosingMethod;
private KillableHttpClient (EntityEnclosingMethod post) {
this.post = пост;
}
public Integer call () создает исключение {
вернуть новый HttpClient (). executeMethod (post);
}
}
}