来自客户端的超时Web服务调用

时间:2011-05-11 14:29:33

标签: java rest timeout resteasy

我正在使用RestEasy Client调用Web服务。一个要求是,如果呼叫运行超过5秒,则中止/超时。我如何使用RestEasy Client实现这一目标?我只看到服务器端超时,即如果在一定时间内未满足,Rest Easy websevice将超时请求。

5 个答案:

答案 0 :(得分:11)

RESTEasy客户端通常使用Apache HttpClient来处理网络会话。

您可以使用自己的自定义超时参数覆盖HttpClient属性:

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);

第一个参数允许您指定建立初始连接的超时,第二个参数允许您指定套接字在没有数据发送的情况下等待的最长时间。

您可以使用修改后的HttpClient构建ClientExecutor:

ClientExecutor executor = new ApacheHttpClient4Executor(httpClient);

可以依次使用它来构建ClientRequest对象。或者,如果您使用REST配置的Spring配置,则可以将其注入RestClientProxyFactoryBean。

它与绝对的5秒超时不完全相同,但取决于你想要完成的任务,调整这两个属性通常会填补这笔费用。

答案 1 :(得分:2)

Carter Page的答案对于Apache HttpClient版本> = 4.0是正确的。

对于早期版本的HttpClient(例如3.1),代码略有不同:

HttpClient httpClient = new HttpClient();
HttpConnectionParams params = httpClient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(connectionTimeoutMillis);
params.setSoTimeout(socketTimeoutMillis);

ClientExecutor executor = new ApacheHttpClientExecutor(httpClient);
MyService service = ProxyFactory.create(MyService.class, URL, executor);

答案 2 :(得分:2)

如果您更喜欢构建器模式,请按以下步骤操作:

 Client client = new ResteasyClientBuilder()
            .establishConnectionTimeout(5, TimeUnit.SECONDS)
            .socketTimeout(5, TimeUnit.SECONDS)
            .build();

取自此处:http://blog.eisele.net/2014/12/setting-timeout-for-jax-rs-20-resteasy-client.html

答案 3 :(得分:0)

如果您正在使用具有spring集成(documentation)的resteasy客户端框架,则以下是设置超时值的方法:

                               

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>

答案 4 :(得分:0)

鉴于 establishConnectionTimeoutsocketTimeout 均已弃用。

redhat website 对 jboss v7.3 的解释:

<块引用>

以下符合 ClientBuilder 规范的方法替换了某些已弃用的 RESTEasy 方法:

  • connectTimeout 方法取代了 establishConnectionTimeout 方法。

    • connectTimeout 方法确定客户端在建立新的服务器连接时必须等待多长时间。
  • readTimeout 方法取代了 socketTimeout 方法。

    • readTimeout 方法确定客户端必须等待服务器响应的时间。

这对我有用 RestEASY 3.12.1.Final

{% load bootstrap4 %}

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Learning Log</title>

    {% bootstrap_css %}
    {% bootstrap_javascript jquery='full' %}
  </head>
  <body>

    <nav class="navbar navbar-expand-md navbar-light bg-light mb-4 border">

      <a class="navbar-brand" href="{% url 'learning_logs:index'%}">Learning Log</a>

      <button class="navbar-toggler" type="button" data-toggle="collapse"
        data-target="#navbarCollapse" aria-controls="navbarCollapse"
        aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span></button>

    <div class="collapse navbar-collapse" id="navbarCollapse">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item">
          <a class="nav-link" href="{% url 'learning_logs:topics'%}">Topics</a>
        </li>

      </ul>

      <ul class="navbar-nav ml-auto">
        {% if user.is_authenticated %}
          <li class="nav-item">
            <span class="navbar-text">Hello, {{ user.username }}.</span>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="{% url 'users:logout' %}">Log out</a>
          </li>
        {% else %}
          <li class="nav-item">
            <a class="nav-link" href="{% url 'users:register' %}">Register</a>
          </li>
          <li class="nav-item">
            <a class="nav-link "href="{% url 'users:login' %}">Log in</a>
          </li>
        {% endif %}

      </ul>

    </div>

    </nav>

    <main role="main" class="container">
      <div class="pb-2 mb-2 border-bottom">
        {% block page_header %}{% endblock page_header %}
      </div>
      <div>
        {% block content %}{% endblock content %}
      </div>
    </main>

  </body>
</html>