在Jetty Embedded中逐个处理请求

时间:2018-02-12 17:07:35

标签: java web-services jetty

我有一个小型网络服务,通过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 status code。服务器抛出RejectedExecutionException并继续执行。

有没有办法配置请求队列并逐个处理它们但不丢弃其余的请求?像这样,对请求进行排队,但限制一次提供的请求数。

1 个答案:

答案 0 :(得分:2)

Jetty没有1个线程== 1请求模型。

在单个请求/响应交换的生命周期内完全可以使用1..n个线程。

不要尝试在连接器或线程池级别控制它,这是不可能的。

相反,请考虑使用QoSFilter (Quality of Service Filter)

这使您可以将特定端点资源(执行这些长时间运行事件的特定servlet)设置为仅具有一组有限的资源,使所有其他请求处理,而不受通过过滤器施加的限制。