gpt4 book ai didi

java - 在 Jetty Embedded 中一一处理请求

转载 作者:行者123 更新时间:2023-12-02 02:19:16 25 4
gpt4 key购买 nike

我有一个小型 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com