我有一个小型 Web 服务,它通过 POST
接收带有一组字符串的 JSON
,处理它们并以 JSON
形式输出结果> 格式。
问题是,处理过程需要大量资源(CPU 和内存),因此我希望能够对请求进行排队并一一处理(或两两处理,等等)。
首先,我使用 QueuedThreadPool
创建了我的服务器,如下所示:
QueuedThreadPool threadPool = new QueuedThreadPool(4, 1);
Server jettyServer = new Server(threadPool);
但这仅限制了线程数量,如果一个线程发出多个请求,服务就会崩溃。
接下来,我尝试使用 LinkedBlockingQueue
。像这样:
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(2);
QueuedThreadPool threadPool = new QueuedThreadPool( 4, 1, 30000, queue);
Server jettyServer = new Server(threadPool);
像这样,它似乎可以工作,因为该服务一次只处理两组文本并且不会崩溃,但问题是,其他请求被丢弃并收到 502 状态代码
。服务器抛出 RejectedExecutionException
并继续执行。
有没有一种方法可以配置请求队列并逐个处理它们但不丢弃其余的?像这样,对请求进行排队,但限制一次服务的请求数量。
最佳答案
Jetty 没有 1 线程 == 1 请求模型。
在单个请求/响应交换的生命周期内完全有可能使用 1..n 个线程。
不要尝试在连接器或线程池级别控制它,这是不可能的。
相反,请考虑使用 QoSFilter (Quality of Service Filter) .
这使您可以将特定端点资源(执行这些长时间运行事件的特定 servlet)设置为仅具有有限的资源集,而让所有其他请求处理,而不受您通过过滤器施加的限制。
关于java - 在 Jetty Embedded 中一一处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751826/