জাভা HTTP ক্লায়েন্ট অনুরোধ নির্ধারিত সময়সীমা সহ


92

আমি আমার মেঘের বেশ কয়েকটি সার্ভারে বিআইটি (পরীক্ষায় অন্তর্নির্মিত) তৈরি করতে চাই। বড় সময়সীমাতে ব্যর্থ হওয়ার জন্য আমার অনুরোধটি দরকার।

আমি জাভা দিয়ে এটি কীভাবে করব?

নীচের মতো কিছু চেষ্টা করা কাজ করবে বলে মনে হচ্ছে না।

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("");
 }
}

- সম্পাদনা: কোন লাইব্রেরি ব্যবহৃত হচ্ছে তা পরিষ্কার করুন -

আমি অ্যাপাচি থেকে httpclient ব্যবহার করছি, এখানে প্রাসঙ্গিক pom.xML বিভাগ রয়েছে

 <dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.0.1</version>
   <type>jar</type>
 </dependency>

আপনি HTTP কার্যকারিতার সমস্তটির জন্য কোন গ্রন্থাগার ব্যবহার করছেন?
nojo

মন্তব্য করার জন্য আপনাকে ধন্যবাদ. আমি আমার পোস্ট আপডেট করেছি।
ম্যাক্সিম ভেক্সলার

উত্তর:


119
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

...

    // set the connection timeout value to 30 seconds (30000 milliseconds)
    final HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
    client = new DefaultHttpClient(httpParams);

4
এটি কি করে? এটি কিসের একটি টাইমআউট সেট করে? দয়া করে দেখুন stackoverflow.com/questions/3000767/...
বচন Veksler

84
অ্যাপাচি এর এইচটিপিপ্লিনেন্টের দুটি পৃথক সময়সীমা রয়েছে: টিসিপি সংযোগ স্থাপনের জন্য কতক্ষণ অপেক্ষা করতে হবে তার একটি সময়সীমা এবং পরবর্তী উপাত্তের বাইটের জন্য কতক্ষণ অপেক্ষা করতে হবে তার একটি পৃথক সময়সীমা। HttpConnicationParams.setConnicationTimeout () হ'ল পূর্ববর্তী, HttpConnicationParams.setSoTimeout () এর পরেরটি।
benvolioT

7
ডিফল্ট সময়সীমা কি? এটি কি 0 = অসীম?
টোবিয়া

4
http.connection.Toutout পূর্ণসংখ্যা সংযোগ স্থাপন না হওয়া অবধি সময়সীমা। শূন্যের মান মানে সময়সীমা ব্যবহৃত হয় না।
maveroid

26
ভবিষ্যতের পাঠকদের কাছে: এটি লক্ষ করা উচিত যে এখানে বর্ণিত ক্লাসগুলি এখন অবহিত করা হয়েছে (২০১-0-০7-০5 অনুযায়ী) যদিও এটি সম্ভবত ২০১০ সালে পোস্ট করার সময় একটি ভাল উত্তর ছিল। এই উত্তরটি দেখুন: stackoverflow.com/a/ 19153314/192801 আরও কিছুটা বর্তমানের জন্য।
হতাশিত

125

আপনি যদি এইচটিটিপি ক্লায়েন্ট সংস্করণ 4.3 এবং তার বেশি ব্যবহার করছেন তবে আপনার এটি ব্যবহার করা উচিত:

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build();
HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();

4
ধন্যবাদ! আপনার উত্তর সন্ধানের আগে এটি করার জন্য হ্রাস করা কমান্ডগুলি থেকে কীভাবে মুক্তি পাওয়া যায় তা নির্ধারণ করার জন্য আমি কমপক্ষে 20 মিনিট সময় ব্যয় করেছি।
ভেক্সটরস স্পেস

ভুলে গেছেন SocketTimeout। এছাড়াও, "ডিফল্ট" সবার জন্য এটা ডিফল্ট মানে HttpClientযে HttpClientBuilderথেকে তৈরি () মাধ্যমে দেব build()পদ্ধতি? বা কেবল যেগুলি দিয়ে যায় setDefaultRequestConfig(requestConfig)? আমি কি বোধ করছি?
এডিটিসি

@ এডটিসি আপনার প্রশ্নটি কিছুটা বিভ্রান্তিকর :)। ডিফল্ট অনুরোধ কনফিগারেশন সমস্ত এইচটিটিপিপোস্ট, এইচটিটিপিগেট, ... উদাহরণগুলির জন্য ব্যবহৃত হবে কেবলমাত্র এইচটিটিপিপ্লিনেন্টকে 'কেবল' ব্যবহার করে। আপনি যদি অন্য কোনও এইচটিপিপ্লিয়েন্ট উদাহরণ তৈরি করেন তবে এই অনুরোধ কনফিগারেশনটি সেই ক্লায়েন্টের সাথে ব্যবহার করা হবে না।
থান্ডার

35

এইচটিপিপ্যারামগুলি নতুন অ্যাপাচি এইচটিটিপি ক্লায়েন্ট লাইব্রেরিতে হ্রাস করা হয়েছে। ল্যাজের প্রদত্ত কোডটি ব্যবহার করা হ্রাসের সতর্কতাগুলির দিকে পরিচালিত করে।

আমি আপনার এইচটিটিপিগেট বা এইচটিটিপিপোস্ট উদাহরণের পরিবর্তে অনুরোধকনফিগ ব্যবহার করার পরামর্শ দিচ্ছি:

final RequestConfig params = RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build();
httpPost.setConfig(params);

"উপরের কোডটি ব্যবহার করা" << এসও কোনও ফোরাম নয় এবং বিভিন্ন কারণে বিভিন্ন উত্তরগুলির উপরে / নীচে সরানো হয়, সুতরাং আপনি কোন কোডটি উল্লেখ করছেন তা আমরা জানি না। আপনি "xyz এর উত্তর থেকে কোড ব্যবহার করে" এর মতো কিছু বলতে পারেন?
এডিটিসি

4
বিটিডব্লিউ, ঝরঝরে উত্তর। তবে যখন থান্ডারের উত্তরটির সাথে তুলনা করা হচ্ছে, এটির মধ্যে ডিফল্ট হিসাবে সেট করার বিপরীতে RequestConfigপ্রত্যেকটিতে সেটিংস স্থাপনের মধ্যে পার্থক্য কী ? HttpPostHttpClient
এডিটিসি

4
হ্যাঁ, আপনি ঠিক বলেছেন, উপরের কোডটি "স্বীকৃত উত্তর" বোঝায় যা সময় মতো পরিবর্তন করা উচিত নয়। আমি যাই হোক না কেন আমার উত্তর আপডেট করব ..
pmartin8

10

দেখে মনে হচ্ছে আপনি এইচটিপিপ্লিনেন্ট এপিআই ব্যবহার করছেন যা আমি সম্পর্কে কিছুই জানি না তবে আপনি কোর জাভা ব্যবহার করে এর মতো কিছু লিখতে পারেন।

try {

   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setRequestMethod("HEAD");
   con.setConnectTimeout(5000); //set timeout to 5 seconds
   return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

} catch (java.net.SocketTimeoutException e) {
   return false;
} catch (java.io.IOException e) {
   return false;
}

4
এটি অ্যাপাচি এইচটিটিপি ক্লায়েন্টের সময়সীমাকে প্রভাবিত করবে না।
লাজ

9
কখনও এটি দাবি করেনি;)
dbyrne

4
এইচটিপিআরএল সংযোগের সময়সীমা সম্পর্কে ধারণা অপর্যাপ্ত। সার্ভার যদি প্রতিক্রিয়া জানাতে শুরু করে তবে হ্যাং হয়ে যায়, সময়সীমা কখনই পৌঁছায় না। এই পার্থক্যের কারণে অ্যাপাচি-র এইচটিপিপিলেট একটি ভাল পছন্দ।
benvolioT

7

আমি খুঁজে পেয়েছি যে সময় নির্ধারণের সময় সেটিংস সেট করে HttpConnectionParamsএবং HttpConnectionManagerআমাদের ক্ষেত্রে সমাধান হয়নি। আমরা org.apache.commons.httpclientসংস্করণ 3.0.1 ব্যবহারের মধ্যে সীমাবদ্ধ ।

আমি কলটি java.util.concurrent.ExecutorServiceপর্যবেক্ষণ করতে একটি ব্যবহার করে শেষ করেছি HttpClient.executeMethod()

এখানে একটি ছোট, স্বনির্ভর উদাহরণ

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</pre>
 */
public class Example {

   private static final String SITE = "http://some.website.com/upload";
   private static final int TIME_OUT_SECS = 5;

   // upload a file and return the response as a string
   public String post(File file) throws 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();
      final List<Future<Integer>> futures = executor.invokeAll(Arrays.asList(new KillableHttpClient(post)), TIME_OUT_SECS, TimeUnit.SECONDS);
      executor.shutdown();
      if(futures.get(0).isCancelled()) {
         throw new IOException(SITE + " has timed out. It has taken more than " + TIME_OUT_SECS + " seconds to respond");
      }
      return post.getResponseBodyAsString();
   }

   private static class KillableHttpClient implements Callable<Integer> {

      private final EntityEnclosingMethod post;

      private KillableHttpClient(EntityEnclosingMethod post) {
         this.post = post;
      }

      public Integer call() throws Exception {
         return new HttpClient().executeMethod(post);
      }
   }
}

7

লাজের সর্বোচ্চ আপের সাথে উল্লিখিত পদ্ধতিটি 4.3 সংস্করণ থেকে অবচয় করা হয়েছে। তাই অনুরোধ কনফিগারেশন অবজেক্টটি ব্যবহার করা এবং তারপরে এইচটিটিপি ক্লায়েন্ট তৈরি করা ভাল

    private CloseableHttpClient createHttpClient()
        {
        CloseableHttpClient httpClient;
        CommonHelperFunctions helperFunctions = new CommonHelperFunctions();
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(306);
        cm.setDefaultMaxPerRoute(108);
        RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(15000)
            .setSocketTimeout(15000).build();
        httpClient = HttpClients.custom()
            .setConnectionManager(cm)
            .setDefaultRequestConfig(requestConfig).build();
        return httpClient;
        }

পুলিংএইচটিপিপ্লিয়েন্টকনেকশন ম্যানেজার ব্যবহারকারী প্রতিটি রুটে সর্বোচ্চ সংযোগের সংখ্যার এবং সর্বাধিক সংখ্যার কনসেন্টেশন নির্ধারণ করে। আমি যথাক্রমে 306 এবং 108 হিসাবে সেট করেছি। বেশিরভাগ ক্ষেত্রে ডিফল্ট মানগুলি পর্যাপ্ত হবে না।

সময়সীমা নির্ধারণের জন্য: আমি অনুরোধকনফিগ অবজেক্টটি ব্যবহার করেছি। সংযোগ পরিচালক থেকে সংযোগের জন্য অপেক্ষা করার সময়সীমা নির্ধারণের জন্য আপনি সম্পত্তি সংযোগের অনুরোধের সময়সীমাও সেট করতে পারেন।


5

এটি ইতিমধ্যে benvoliot দ্বারা একটি মন্তব্যে উল্লেখ করা হয়েছিল উপরের । তবে, আমি মনে করি এটি একটি শীর্ষ-স্তরের পোস্টের পক্ষে মূল্যবান কারণ এটি নিশ্চিতভাবেই আমার মাথা আঁচড়ায়। এটি অন্য কাউকে সাহায্য করার ক্ষেত্রে এটি পোস্ট করছি।

আমি একটি সাধারণ পরীক্ষার ক্লায়েন্ট লিখেছি এবং CoreConnectionPNames.CONNECTION_TIMEOUTসময়সীমা সেই ক্ষেত্রে পুরোপুরি কাজ করে। সার্ভার সাড়া না দিলে অনুরোধটি বাতিল হয়ে যায়।

সার্ভার কোডের ভিতরে আমি আসলে যাচাই করার চেষ্টা করছিলাম, অভিন্ন কোডটি কখনই শেষ হয় না।

CoreConnectionPNames.SO_TIMEOUTএইচটিটিপি সংযোগ ( CoreConnectionPNames.CONNECTION_TIMEOUT) এর পরিবর্তে সকেট সংযোগ ক্রিয়াকলাপে ( ) সময় সময় এটি পরিবর্তন করা আমার জন্য সমস্যাটি স্থির করে।

এছাড়াও, এ্যাপাচি ডক্স যত্ন সহকারে পড়ুন: http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html#CONNECTION_TIMEOUT

যে বিট নোট করুন

দয়া করে মনে রাখবেন যে এই প্যারামিটারটি কেবলমাত্র কোনও নির্দিষ্ট স্থানীয় ঠিকানার সাথে আবদ্ধ সংযোগগুলিতে প্রয়োগ করা যেতে পারে।

আমি আশা করি যে আমি যে সমস্ত মাথা ঘামিয়েছি তা অন্য কাউকে বাঁচায়। এটি আমাকে ডকুমেন্টেশন পুরোপুরি না পড়তে শিখিয়ে দেবে!


2

ওপি পরে জানায় যে তারা অ্যাপাচি কমন্স এইচটিটিপিপ্লায়েন্ট 3.0.0 ব্যবহার করছে

 HttpClient client = new HttpClient();
        client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
        client.getHttpConnectionManager().getParams().setSoTimeout(5000);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.