【问题标题】:Spring ws timeout on server side服务器端的 Spring ws 超时
【发布时间】:2024-01-21 00:57:01
【问题描述】:

我有一些使用 Spring Web 服务公开的 Web 服务。

我想在服务器端设置一个最大超时,我的意思是,当客户端调用我的 Web 服务时,它的持续时间不能超过固定时间。有可能吗?

我找到了很多关于客户端超时的信息,但没有找到服务器超时的信息。

【问题讨论】:

    标签: spring timeout spring-ws


    【解决方案1】:

    这是在服务器本身而不是应用程序级别设置的,因此它取决于应用程序服务器。

    这样做的原因是服务器代码打开了 HTTP 连接使用的侦听套接字,因此只有服务器代码可以通过将超时传递给开始侦听给定端口的套接字 API 调用来设置超时。

    例如,这是在文件server.xml中的Tomcat中执行此操作的方法:

    <Connector connectionTimeout="20000" ... />
    

    【讨论】:

    • 首先,非常感谢。我已经研究过了,但它不起作用。我读过关于配置像 org.apache.catalina.valves.StuckThreadDetectionValve 这样的阀门来检测线程处于活动状态的时间,但它只记录事实,而不是停止它。为什么connectionTimeout不起作用?非常感谢
    【解决方案2】:

    您可以通过使 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
    }
    

    }

    【讨论】: