我有一个小型网络服务,通过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
并继续执行。
有没有办法配置请求队列并逐个处理它们但不丢弃其余的请求?像这样,对请求进行排队,但限制一次提供的请求数。
答案 0 :(得分:2)
Jetty没有1个线程== 1请求模型。
在单个请求/响应交换的生命周期内完全可以使用1..n个线程。
不要尝试在连接器或线程池级别控制它,这是不可能的。
相反,请考虑使用QoSFilter (Quality of Service Filter)。
这使您可以将特定端点资源(执行这些长时间运行事件的特定servlet)设置为仅具有一组有限的资源,使所有其他请求处理,而不受通过过滤器施加的限制。