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

标签 java web-services jetty

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

相关文章:

php - nginx X-Frame-Options 仍然具有相同的值

css - 无法确定 Wicket 中背景图像的路径

ssl - 如何在 Zeppelin 中设置 SSL

java - 嵌入式 Jetty 处理 URL 来提供内容

java - 改变屏幕尺寸

java - play框架服务器有像apache一样的rewrite_mode吗?

java - 为什么 MVC 和单例都是 'design pattern' ?

java - 获取一个android项目的类结构

java - 从 weblogic 11g 中部署为 war 的代码调用 soap 服务时出现握手错误

java - 指定目标命名空间?