-->

Spring ws timeout on server side

2019-07-16 07:18发布

问题:

I have some web services exposed using spring web services.

I would like to set a maximun timeout on server side, I mean, when a client invokes my web service It could not last more than a fixed time. Is it possible?

I have found lot of information about client timeouts, but not server timeout.

Thanks in advanced.

回答1:

This is set at the level of the server itself and not the application, so it's application server dependent.

The reason for this is that it's the server code that opens the listening socket used by the HTTP connection, so only the server code can set a timeout by passing it to the socket API call that starts listening to a given port.

As an example, this is how to do it in Tomcat in file server.xml:

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


回答2:

You can work around this issue by making the web service server trigger the real work on another thread and countdown the time out it self and return failure if timed out.

Here is an example of how you can do it, it should time out after 10 seconds:

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
}

}