স্প্রিং রেস্টটেম্পলেট সময়সীমা


125

আমি আমার ওয়েব অ্যাপ্লিকেশন দ্বারা ব্যবহৃত বিশ্রাম পরিষেবার জন্য সংযোগের সময়সীমা সেট করতে চাই। আমি আমার সেবার সাথে কথা বলার জন্য স্প্রিংয়ের রেস্টটেম্পলেট ব্যবহার করছি। আমি কিছু গবেষণা করেছি এবং আমি নীচে এক্সএমএল খুঁজে পেয়েছি এবং ব্যবহার করেছি (আমার অ্যাপ্লিকেশন এক্সএমএল) যা আমার বিশ্বাস টাইমআউট নির্ধারণের জন্য। আমি স্প্রিং 3.0 ব্যবহার করছি।

আমি এখানেও একই সমস্যাটি দেখেছি রেস্টস্টেম্পলেট সহ স্প্রিং ওয়েবসার্চেসের জন্য টাইমআউট কনফিগারেশন কিন্তু সমাধানগুলি পরিষ্কার বলে মনে হচ্ছে না , আমি স্প্রিং কনফিগারেশনের মাধ্যমে টাইমআউট মানগুলি সেট করতে পছন্দ করব

<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>

      <bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
        <property name="readTimeout" value="${restURL.connectionTimeout}" />
      </bean>
    </constructor-arg>
</bean>

মনে হয় যে আমি রিডটাইমআউট সেট করেছি তা হ'ল আমি নিম্নলিখিতটি পেয়েছি:

নেটওয়ার্ক কেবল সংযোগ বিচ্ছিন্ন: প্রায় 20 সেকেন্ড অপেক্ষা করে এবং ব্যতিক্রমের পরে রিপোর্টগুলি:

org.springframework.web.client.ResourceAccessExcep tion: I / O ত্রুটি: হোস্ট করার কোনও পথ নেই: সংযোগ; নেস্টেড ব্যতিক্রম java.net.NoRouteToHostException: হোস্ট করার কোনও পথ নেই: সংযুক্ত

Url ভুল তাই 404 বিশ্রাম পরিষেবা দিয়ে ফিরে এসেছে: প্রায় 10 সেকেন্ড অপেক্ষা করে এবং ব্যতিক্রমের পরে রিপোর্টগুলি:

org.springframework.web.client.HttpClientErrorException: 404 পাওয়া যায় নি

আমার প্রয়োজনীয়তার জন্য স্বল্প সময়সীমা দরকার তাই এগুলি পরিবর্তন করতে আমার সক্ষম হওয়া দরকার। আমি কী ভুল করছি সে সম্পর্কে কোনও ধারণা?

অনেক ধন্যবাদ.

উত্তর:


163

জন্য স্প্রিং বুট> = 1.4

@Configuration
public class AppConfig
{
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
    {
        return restTemplateBuilder
           .setConnectTimeout(...)
           .setReadTimeout(...)
           .build();
    }
}

জন্য স্প্রিং বুট <= 1.3

@Configuration
public class AppConfig
{
    @Bean
    @ConfigurationProperties(prefix = "custom.rest.connection")
    public HttpComponentsClientHttpRequestFactory customHttpRequestFactory() 
    {
        return new HttpComponentsClientHttpRequestFactory();
    }

    @Bean
    public RestTemplate customRestTemplate()
    {
        return new RestTemplate(customHttpRequestFactory());
    }
}

তারপরে আপনার application.properties

custom.rest.connection.connection-request-timeout=...
custom.rest.connection.connect-timeout=...
custom.rest.connection.read-timeout=...

এই কাজ করে কারণ HttpComponentsClientHttpRequestFactoryপ্রকাশ্য setters হয়েছে connectionRequestTimeout, connectTimeoutএবং readTimeoutএবং @ConfigurationPropertiesআপনার জন্য সেট তাদের।


জন্য স্প্রিং 4.1 বা স্প্রিং 5 স্প্রিং বুট ছাড়া ব্যবহার @Configurationপরিবর্তেXML

@Configuration
public class AppConfig
{
    @Bean
    public RestTemplate customRestTemplate()
    {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(...);
        httpRequestFactory.setConnectTimeout(...);
        httpRequestFactory.setReadTimeout(...);

        return new RestTemplate(httpRequestFactory);
    }
}

চমৎকার উদাহরণ! দয়া করে, বিজোড় newবিবৃতিটি Spring Bootউদাহরণস্বরূপ সরান
স্টাসকলোডিয়ুক

7
নোট করুন যে এই কনফিগারেশনের পরে, রেস্টটেম্পলেট অ্যাপাচি HTTP ক্লায়েন্ট ব্যবহার করবে (টাইমআউট সেট করতে)। অ্যাপাচি HTTP ক্লায়েন্ট সংযোগ পুলের ডিফল্ট ম্যাক্সপ্রেট রুট থ্রেডগুলি 5 এবং সর্বোচ্চ মোট থ্রেড 10 (HTTPClient-4.5.2)। আমাদের কিছু পরিস্থিতিতে এটি সেট করা দরকার (যেমন আমাদের অনেক হোস্টের সাথে সংযোগ প্রয়োজন এবং আরও সংযোগ প্রয়োজন)।
নীল রঙের

2
দয়া করে মনে রাখবেন connectionRequestTimeoutঅ্যাট্রিবিউট উপলব্ধ 4.1.4.RELEASE আগে
Taoufik Mohdit

আমি স্প্রিং বুট> = 1.4 এর জন্য স্প্রিং বুট> = 2.1.8 এ কনফিগারেশন চেষ্টা করেছি এবং আমার সাফল্য হয়নি। এই কনফিগারেশনটি তৈরি করতে আমি এই পোস্টটি ( zetcode.com/springboot/resttemplate ) অনুসরণ করেছি ।
অ্যাঞ্জেলো পোলোটো

@ অ্যাঞ্জেলোপলোট আপনি যে লিঙ্কটি পোস্ট করেছেন তা এই সমাধানটির মতো একই পরামর্শ দেয়। নিবন্ধটি বলেছে: "বিকল্পভাবে, আমরা কাজটি করতে রেস্টস্টেম্পলেটবিল্ডারটি ব্যবহার করতে পারি" "
ডাস্টিন.সচল্টজ

76

অবশেষে আমি এই কাজ পেয়েছিলাম।

আমি মনে করি যে আমাদের প্রকল্পে কমন্স-এইচডি-ক্লায়েন্ট জারের দুটি ভিন্ন সংস্করণ ছিল তা সহায়তা করছে না। একবার আমি এটি বাছাই করে দেখলাম আপনি দুটি জিনিস করতে পারেন ...

কোডে আপনি নিম্নলিখিতটি রাখতে পারেন:

HttpComponentsClientHttpRequestFactory rf =
    (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(1 * 1000);
rf.setConnectTimeout(1 * 1000);

এই কোডটি প্রথমবার বলা হয় এটি HttpComponentsClientHttpRequestFactoryদ্বারা ব্যবহৃত শ্রেণীর সময়সীমা নির্ধারণ করবে RestTemplate। অতএব, পরবর্তী সময়ে করা সমস্ত কল RestTemplateউপরে বর্ণিত সময়সীমার সেটিংস ব্যবহার করবে।

বা আরও ভাল বিকল্পটি এটি করা:

<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
            <property name="readTimeout" value="${application.urlReadTimeout}" />
            <property name="connectTimeout" value="${application.urlConnectionTimeout}" />
        </bean>
    </constructor-arg>
</bean>

যেখানে আমি RestOperationsআমার কোডে ইন্টারফেসটি ব্যবহার করি এবং কোনও বৈশিষ্ট্য ফাইল থেকে সময়সীমা মান পাই।


সুতরাং এটি এই বিশ্রাম টেম্পলেট (যা একটি সিঙ্গলটন) এর মাধ্যমে সমস্ত কলের সময়সীমা নির্ধারণ করে। আপনি কি জানেন যে প্রতি অনুরোধের সময়সীমাটি নিয়ন্ত্রণ করা সম্ভব কিনা? (যেমন: একটি পোস্ট কলের জন্য 10 সেকেন্ড এবং একটি কল ইত্যাদির জন্য 5 সেকেন্ড)
কোডসাল

@ সার্ডো যেখানে আমি আমার কোডে রেস্টওপ্রেসেশন ইন্টারফেসটি ব্যবহার করি। এর জন্য আমাদের কোনও স্পষ্টত ইন্টারফেস তৈরি করা দরকার?
কানাগুলি

আপনি বলেছিলেন যে আপনি স্প্রিং are.০ ব্যবহার করছেন - যা আমিও আটকেছি - তবে in.০ এ কোনও এইচটিপি কম্পোনেন্টস ক্লায়েন্ট এইচটিপিআরকোস্টফ্যাক্টরি নেই! আপনি বসন্ত আপডেট করেছেন?
কুট্টি

5
উপরের কোডটি সর্বশেষ বসন্তে কাজ করে না। এটি ClassCastException দেয়java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Comiventor

40

এই প্রশ্নটি একটি স্প্রিং বুট অনুসন্ধানের জন্য প্রথম লিঙ্ক, অতএব, অফিসিয়াল ডকুমেন্টেশনে প্রস্তাবিত সমাধানটি এখানে রাখা ভাল হবে । স্প্রিং বুটের নিজস্ব সুবিধামুচল বিন রিনস্টেম্পলেট বিল্ডার রয়েছে :

@Bean
public RestTemplate restTemplate(
        RestTemplateBuilder restTemplateBuilder) {

    return restTemplateBuilder
            .setConnectTimeout(Duration.ofSeconds(500))
            .setReadTimeout(Duration.ofSeconds(500))
            .build();
}

রেস্টটেম্পলেট ইনস্ট্যান্সগুলির ম্যানুয়াল তৈরি করা একটি সম্ভাব্য সমস্যাজনক পদ্ধতির কারণ অন্য স্বয়ংক্রিয়ভাবে কনফিগার করা মটরশুটি ম্যানুয়ালি তৈরি হওয়া দৃষ্টান্তগুলিতে ইনজেকশন দেওয়া হচ্ছে না।


2
আমার মতো বসন্তের আগতদের জন্য একটি নোট: কেবলমাত্র @ কনফিগারেশনে এটি স্টিক করা কোনও কিছুই করবে না। এই পদ্ধতির জন্য আপনার এই রেস্টস্টেম্পলেটটি একই জায়গায় লাগানো আছে যা এটি রেস্টস্টেম্প্লেটএইচআরটি ট্রান্সপোর্টের নির্মাতার পক্ষে যুক্তি হিসাবে ব্যবহার করে যা আপনি আপনার সক্সজেএসসিলেন্টে স্থানান্তরিত আপনার ট্রান্সপোর্টের তালিকায় যুক্ত করবেন।
কী লেআউট

setConnectTimeoutএবং এর কিছু বাস্তবায়ন setReadTimeout
অবমূল্যায়ন করা

17

এখানে আমার 2 সেন্ট। নতুন কিছু নয়, তবে কিছু ব্যাখ্যা, উন্নতি এবং আরও নতুন কোড।

ডিফল্ট হিসাবে, RestTemplateঅসীম সময়সীমা আছে। দুটি ধরণের টাইমআউট রয়েছে: সংযোগের সময়সীমা এবং পাঠের সময় শেষ। উদাহরণস্বরূপ, আমি সার্ভারের সাথে সংযোগ করতে পারলাম কিন্তু আমি ডেটা পড়তে পারিনি। অ্যাপ্লিকেশনটি ঝুলছিল এবং আপনার কী চলছে সে সম্পর্কে কোনও ধারণা নেই।

আমি টীকাগুলি ব্যবহার করতে যাচ্ছি, যা এই দিনগুলিতে এক্সএমএল এর চেয়ে বেশি পছন্দ করে।

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {

        var factory = new SimpleClientHttpRequestFactory();

        factory.setConnectTimeout(3000);
        factory.setReadTimeout(3000);

        return new RestTemplate(factory);
    }
}

এখানে আমরা SimpleClientHttpRequestFactoryসংযোগটি সেট করতে এবং সময় আউট পড়তে ব্যবহার করি use এরপরে এটি নির্মাণকারীকে দেওয়া হয় RestTemplate

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        return builder
                .setConnectTimeout(Duration.ofMillis(3000))
                .setReadTimeout(Duration.ofMillis(3000))
                .build();
    }
}

দ্বিতীয় সমাধানে, আমরা এটি ব্যবহার করি RestTemplateBuilder। দুটি পদ্ধতির পরামিতিগুলিও লক্ষ্য করুন: তারা নেয় Duration। ওভারলোডেড পদ্ধতিগুলি যা সরাসরি মিলি সেকেন্ডে নেয় এখন অবহেলা করা হয়।

স্প্রিং বুট 2.1.0 এবং জাভা 11 দিয়ে পরীক্ষা করুন Edit


আপনি কোন বসন্ত এবং জাভা সংস্করণ ব্যবহার করছেন?
orirab

2
স্প্রিং বুট ২.১.০ এবং জাভা ১১ একটি কাজের উদাহরণের জন্য, আপনি আমার টিউটোরিয়ালটি দেখে নিতে পারেন: zetcode.com/springboot/resttemplate
জান Bodnar

আমি উত্তর এই জোড়ার প্রস্তাব
orirab

Github.com/spring-projects/spring-boot/blob/master/… দেখুন । এটি স্প্রিং বুট ২.১.০ এ যুক্ত হয়েছিল।
জান বোদনার

আপনাকে ধন্যবাদ জনবদনার, আপনি টিউটোরিয়ালটি কেবলমাত্র আমার স্প্রিং বুট x.x
অ্যাঞ্জেলো পোলোটো

15

সময়সীমা নির্ধারণের জন্য এখানে একটি সহজ উপায়:

RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());

private ClientHttpRequestFactory getClientHttpRequestFactory() {
    int timeout = 5000;
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
      new HttpComponentsClientHttpRequestFactory();
    clientHttpRequestFactory.setConnectTimeout(timeout);
    return clientHttpRequestFactory;
}

0

আমারও অনুরূপ দৃশ্য ছিল, তবে একটি প্রক্সিও সেট করা দরকার ছিল। এটি করার সবচেয়ে সহজ উপায়টি হ'ল SimpleClientHttpRequestFactoryপ্রক্সিটি নির্ধারণের স্বাচ্ছন্দ্যের জন্য প্রসারিত করা (নন-প্রোড বনাম প্রোডের জন্য বিভিন্ন প্রক্সি)। আপনার যদি প্রক্সিটির প্রয়োজন না হয় এমনকি এটি এখনও কাজ করা উচিত। তারপরে আমার বর্ধিত শ্রেণিতে আমি উত্সopenConnection(URL url, Proxy proxy) হিসাবে একই পদ্ধতিটি ব্যবহার করে পদ্ধতিটিকে ওভাররাইড করছি তবে ফিরে আসার আগে সময়সীমা নির্ধারণ করেছি।

@Override
protected HttpURLConnection openConnection(URL url, Proxy proxy) throws IOException {
    URLConnection urlConnection = proxy != null ? url.openConnection(proxy) : url.openConnection();
    Assert.isInstanceOf(HttpURLConnection.class, urlConnection);
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(5000);
    return (HttpURLConnection) urlConnection;
}

0

বেনস্ক্যাবিয়ার উত্তরটি প্রসারিত করতে :

private RestTemplate restCaller = new RestTemplate(getClientHttpRequestFactory());

private ClientHttpRequestFactory getClientHttpRequestFactory() {
    int connectionTimeout = 5000; // milliseconds
    int socketTimeout = 10000; // milliseconds
    RequestConfig config = RequestConfig.custom()
      .setConnectTimeout(connectionTimeout)
      .setConnectionRequestTimeout(connectionTimeout)
      .setSocketTimeout(socketTimeout)
      .build();
    CloseableHttpClient client = HttpClientBuilder
      .create()
      .setDefaultRequestConfig(config)
      .build();
    return new HttpComponentsClientHttpRequestFactory(client);
}

0
  1. সিম্পলক্লিয়েন্টএইচটিপিআরকুয়েস্টফ্যাক্টিরের সাথে রিসেটম্প্লেট টাইমআউট প্রোগ্রামক্রমে সময়সীমা সমাপ্তির বৈশিষ্ট্যগুলিকে ওভাররাইড করতে আমরা নীচের মত সরলক্লিয়েন্টএইচটিপিআরকুয়েস্টফ্যাক্টারি শ্রেণিকে কাস্টমাইজ করতে পারি।

সিম্পলক্লিয়েন্টএইচটিপিআরকুয়েস্টফ্যাক্টরীর সাথে ওভাররাইড সময়সীমা

//Create resttemplate
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());

//Override timeouts in request factory
private SimpleClientHttpRequestFactory getClientHttpRequestFactory() 
{
    SimpleClientHttpRequestFactory clientHttpRequestFactory
                      = new SimpleClientHttpRequestFactory();
    //Connect timeout
    clientHttpRequestFactory.setConnectTimeout(10_000);

    //Read timeout
    clientHttpRequestFactory.setReadTimeout(10_000);
    return clientHttpRequestFactory;
}
  1. এইচটিটিপি কম্পোনেন্টস ক্লায়েন্টএইচটিপিপিউকুয়েস্টফ্যাক্টরি সিম্পল ক্লায়েন্টএইচটিপিআরেক্সেস্টফ্যাক্টির সাথে রিসটেম্প্লেট টাইমআউটটি টাইমআউট সেট করতে সহায়তা করে তবে এটি কার্যকারিতাতে খুব সীমাবদ্ধ এবং রিয়েলটাইম অ্যাপ্লিকেশনগুলিতে পর্যাপ্ত প্রমাণিত হতে পারে না। প্রোডাকশন কোডে, আমরা এইচটিটিপি কম্পোনেন্টস ক্লায়েন্ট এইচটিপিআরকুয়েস্টফ্যাক্টরিটি ব্যবহার করতে চাই যা পুনরায় স্থাপনের পাশাপাশি এইচটিটিপি ক্লায়েন্ট লাইব্রেরি সমর্থন করে।

HTTPClient অন্যান্য দরকারী বৈশিষ্ট্য সরবরাহ করে যেমন সংযোগ পুল, নিষ্ক্রিয় সংযোগ ব্যবস্থা ইত্যাদি provides

আরও পড়ুন: স্প্রিং রেস্টটেম্পলেট + এইচটিটিপিপ্লিন্ট কনফিগারেশন উদাহরণ

এইচটিটিপি কম্পোনেন্টস ক্লায়েন্ট এইচটিপিআরকুয়েস্টফ্যাক্টিরের সাথে ওভাররাইড সময়সীমা

//Create resttemplate
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());

//Override timeouts in request factory
private SimpleClientHttpRequestFactory getClientHttpRequestFactory() 
{
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
                      = new HttpComponentsClientHttpRequestFactory();
    //Connect timeout
    clientHttpRequestFactory.setConnectTimeout(10_000);

    //Read timeout
    clientHttpRequestFactory.setReadTimeout(10_000);
    return clientHttpRequestFactory;
}

রেফারেন্স: স্প্রিং রেস্টটেম্পলেট টাইমআউট কনফিগারেশন উদাহরণ

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