我使用嵌入式Jetty来托管WEB服务器。请求被转发(通过我的内部实现)到动态加载的 JAR 中的代码。在某些时候,我需要热更新内存中的 JAR,为此我等待请求完成,但可能会因为编程错误或实际长时间运行的操作等待超出合理时间而发生。
我想在一段时间后取消处理 WEB 请求。
在这种情况下,我能对码头做些什么(8+节)?
PS:我知道 Thread.stop() 在带有卡住 WEB 请求的线程上,这似乎不是一个好方法。
您可以编写一个 JettyHandlerWrapper
,如果请求线程在一段时间后仍未完成,则使用ScheduledExecutorService
中断请求线程。 有关示例,请参阅此处:
https://github.com/outbrain/ob1k/blob/master/ob1k-jetty/src/main/java/com/outbrain/ob1k/server/jetty/handler/RequestTimeoutHandler.java
唯一有效的请求取消是终止连接和/或端点。
这通常(并且很容易)通过空闲超时完成。
要对 jar 进行热插拔,请关闭(或停止)连接器,等待所有请求/连接空闲超时,交换 jar,然后重新启动连接器。