我有一个小型Web服务,该服务通过POST
A带有一组字符串的CC_1 A接收,处理它们并以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
并继续执行。
是否有一种方法可以配置请求的队列并一一处理但不丢弃其余部分?这样,排队请求,但一次限制了一次服务的请求数。
jetty没有1个线程== 1请求模型。
完全有可能在单个请求/响应交换的寿命中使用1..n线程。
不要试图在连接器或线程池级别上控制它,这是不可能的。
相反,请考虑使用Qosfilter(服务质量过滤器(。
这使您可以设置特定的端点资源(执行这些长期运行事件的特定servlet(仅具有有限的资源,而所有其他请求都可以处理处理,而无需通过过滤器施加的限制。