2011-12-29 9 views
6

Tôi hiện đang sử dụng HttpClient 4 để thực hiện một yêu cầu POST đến một máy chủ từ xa như thế này:Đóng HttpClient kết nối trước khi timout đạt

HttpResponse response = httpClient.execute(request); 
    InputStream is = response.getEntity().getContent(); 

Khi máy chủ là không thể truy cập nó cần một lượng tự cấu hình của thời gian trước khi kết nối thực sự hết giờ. Trong quá trình periode đó, hàm execute() là một cuộc gọi chặn.

Điều tôi đang tìm kiếm là cách hủy lệnh execute() trước thời gian chờ tự nhiên sao cho luồng của tôi chạy lệnh execute() không bị chặn nữa và sẽ kết thúc một cách duyên dáng.

Tôi đã thử

request.abort(); 

httpClient.getConnectionManager().shutdown(); 

Nhưng cả hai cuộc gọi không làm gián đoạn thực hiện(). Có cách nào khác để hủy nỗ lực kết nối liên tục không?

Trả lời

0

Quấn cuộc gọi theo số Future và gọi get with timeout.

+0

Tôi đang tìm kiếm một cách để ngăn chặn chặn thực thi() không phải chờ đợi lâu hơn nữa. – Moritz

+0

Tương lai impl sẽ "chặn" nhưng chuỗi gọi có thể chờ đợi một số đo chính xác của msecs và sau đó "hết giờ" và tiếp tục theo cách vui vẻ. – alphazero

+0

Tôi không muốn đợi một khoảng thời gian chính xác mà tôi muốn dừng việc thực hiện() chặn luồng hiện tại. – Moritz

0

Tôi nghĩ rằng bạn có thể đặt ConnectionTimeout cho bất cứ thời gian tối đa mà bạn muốn sử dụng các phương pháp: setConnectionTimeout()

setSoTimeout() 
+0

Tôi đã đặt thời gian chờ kết nối trước đó. Vấn đề tôi đang phải đối mặt là tôi muốn ngắt lời thực thi() bằng tay trước khi hết thời gian chờ. – Moritz

+0

Bạn đã đóng InputStream chưa? Một câu hỏi khác là, 'yêu cầu' trong câu hỏi của bạn, điều đó có nghĩa là HttpGet/HttpPost? – kosa

+0

Tôi chưa nhận được bất kỳ luồng đầu vào nào vì .execute() đang chặn cho đến khi hết thời gian chờ socket trong trường hợp đó SocketException được ném ra. Những gì tôi muốn đạt được là dừng việc thực hiện (và thread đang bị chặn) TRƯỚC KHI timeout socket khởi động. Yêu cầu là một yêu cầu POST. – Moritz