我有一些使用spring web服务公开的web服务。
我想在服务器端设置一个最大超时,我的意思是,当客户端调用我的web服务时,它不能持续超过固定时间。有可能吗?
我发现了很多关于客户端超时的信息,但没有发现服务器超时的信息。
这是在服务器本身而不是应用程序级别设置的,因此它依赖于应用程序服务器。
原因是服务器代码打开了HTTP连接使用的侦听套接字,因此只有服务器代码可以通过将其传递给开始侦听给定端口的套接字API调用来设置超时
例如,以下是如何在Tomcat中的文件server.xml
:中执行此操作
<Connector connectionTimeout="20000" ... />
您可以通过让web服务服务器触发另一个线程上的实际工作来解决这个问题,并自行倒计时超时,如果超时则返回失败。
下面是一个如何做到这一点的例子,它应该在10秒后超时:
public class Test {
private static final int ONE_SECOND = 1_000;
public String webserviceMethod(String request) {
AtomicInteger counter = new AtomicInteger(0);
final ResponseHolder responseHolder = new ResponseHolder();
// Create another thread
Runnable worker = () -> {
// Do Actual work...
responseHolder.finished = true;
responseHolder.response = "Done"; // Actual response
};
new Thread(worker).start();
while (counter.addAndGet(1) < 10) {
try {
Thread.sleep(ONE_SECOND);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (responseHolder.finished) {
return responseHolder.response;
}
}
return "Operation Timeout"; // Can throw exception here
}
private final class ResponseHolder {
private boolean finished;
private String response; // Can be any type of response needed
}
}