Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 619 Vote(s) - 3.42 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Spring - server.connection-timeout not working

#1
In my `application.properties` file I have...

server.port=8086
server.connection-timeout=15000

I know that the file is being loaded correctly because the server is running on port 8086.

In the application I have a `RestController`

@RestController
class TestController {
@GetMapping()
fun getValues(): ResponseEntity<*> {
return someLongRunningProcessPossiblyHanging()
}
}

When I call the endpoint, the request never times out, it just hangs indefinitely.

Am I missing something?

**NOTE:** I've also been informed that Tomcat uses this field in minutes, not milliseconds (rather unusual choice IMO). I've tried setting this to `server.connection-timeout=1` denoting 1 minute, but this didn't work either.

**NOTE:** I don't want _another_ HTTP request to cause the previous request to time out, I want each HTTP request to timeout of it's own accord, should too much time elapse to serve the request.
Reply

#2
From the official [docs][1]:

> server.connection-timeout= # Time that connectors wait for another HTTP request before closing the connection. When not set, the connector's container-specific default is used. Use a value of -1 to indicate no (that is, an infinite) timeout.

Another [ref][2], also mentions the same. It should work for you.


[1]:

[To see links please register here]

[2]:

[To see links please register here]

Reply

#3
> When I call the endpoint, the request never times out, it just hangs indefinitely.

`server.connection-timeout` isn't a request timeout. It is a timeout for idle connections, i.e. those that have already had a request/response pair and on which the server is now awaiting a second request. It is essentially a server-side read timeout.
Reply

#4
`connection-timeout` does not apply to long running requests. It does apply to the initial connection, when the server waits for the client to say something.

Tomcat docs (not Spring Boot) define it as _The number of milliseconds this Connector will wait, after accepting a connection, for the request URI line to be presented [...]_

To test the setting `server.connection-timeout=4000` I connect using `netcat` and I don't send any HTTP request/headers. I get:

$ time nc -vv localhost 1234
Connection to localhost 1234 port [tcp/*] succeeded!

real 0m4.015s
user 0m0.000s
sys 0m0.000s

---
**Alternatives**

**1) Async**

From [brightinventions.pl - Spring MVC Thread Pool Timeouts](

[To see links please register here]

):
> In Spring MVC there is no way to configure a timeout unless you use async method. With async method one can use spring.mvc.async.request-timeout= to set amount of time (in milliseconds) before asynchronous request handling times out.

I've set `spring.mvc.async.request-timeout=4000` and I get a timeout in the browser with this:

@GetMapping("/test-async")
public Callable<String> getFoobar() {
return () -> {
Thread.sleep(12000); //this will cause a timeout
return "foobar";
};
}

See

[To see links please register here]



**2) Servlet filter**

Another solution would be to use a servlet filter [brightinventions.pl - Request timeouts in Spring MVC](

[To see links please register here]

) (Kotlin):

override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
val completed = AtomicBoolean(false)
val requestHandlingThread = Thread.currentThread()
val timeout = timeoutsPool.schedule({
if (completed.compareAndSet(false, true)) {
requestHandlingThread.interrupt()
}
}, 5, TimeUnit.SECONDS)

try {
filterChain.doFilter(request, response)
timeout.cancel(false)
} finally {
completed.set(true)
}
}

**3) Tomcat Stuck Thread Detection Valve?**

Tomcat has a [Stuck Thread Detection Valve](

[To see links please register here]

) but I don't know if this can be configured programmatically using Spring Boot.
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through