2010-03-19 74 views
0

1)我的环境是web应用程序,我开发servlet来接收请求。逻辑控制并发块/方法

A)在一些块/方法我想控制并发往不大于5
B)是否存在在该块5请求时,新产品必须等待最多60秒钟,则抛出错误
C)如果有睡眠/等待请求超过30,第31个请求将被抛出错误

我该怎么做?

2)(可选问题)从上面我必须分配控制逻辑到所有集群主机。 我打算使用hazelcast共享控制逻辑(例如,当前计数器)

我看到他们提供的BlockingQueue & ExectorService,但我不知道如何在我的情况下使用。 如果你有想法,请推荐。

+0

我已经阅读了3次以上的问题,并想了解一下这个过程是否合理。我没看见。您的意图是真的限制servlet上的最大并发请求数量吗?你需要什么?什么是功能要求?您认为这是解决方案的问题是什么? – BalusC

+0

我做了一个供应过程,而不是一个网页servlets。当请求来自客户端时,我有新的线程启动并执行活动。 一些活动限制并发。我的观点 – Hlex

回答

0

尝试semaphors

一个计数信号量。从概念上讲, 信号量拥有一套许可证。 如果需要,每个获取()会阻止 ,直到获得许可证,然后 接受它。每个版本()都会添加一个 许可证,可能会释放阻止收单方的 。但是,不使用实际的许可证对象;信号量 只保留可用数量 的计数,并据此采取行动。

1

@Roman和@David Soroko的回答说如何在一个servlet中完成这项工作(如OP问)。

但是,这种方法存在的问题是tomcat必须为每个请求分配一个线程,以便它们可以参与由servlet实现的排队/超时逻辑。每个线程都使用内存和其他资源。 这并不好。如果你没有配置足够的线程,请求将被tomcat请求分派器丢弃,或者使用不同的逻辑排队/超时。

另一种方法是在web服务器中使用非servlet体系结构;例如Grizzly,更具体地说是Grizzly Comet。这是一个很大的话题,坦率地说,我不太了解它深入实施的细节。

编辑 - 在servlet模型中,每个请求在整个生命周期内都被分配给一个线程。例如,在典型的“服务器推送”模式中,每个活动客户端都有一个未完成的HTTP请求,要求服务器提供更多数据。当新数据到达服务器时,服务器发送响应,客户端立即发送新的请求。在传统的servlet实现模型中,这意味着即使大多数线程只是在等待数据到达,服务器也必须为每个活动客户端提供一个“进行中”的请求...和一个线程...。

在可伸缩体系结构中,您将从线程分离请求,以便该线程可用于处理其他请求。之后(例如,当数据“到达”“服务器推送”示例中)时,请求将被附加到线程(可能是不同的线程)以继续处理。在Grizzly中,我明白这是使用基于事件的处理模型完成的,但我想你也可以使用基于协程的模型。

+0

@大卫 - 我从来没有说过你。另外,那不是我的观点。 –

+0

我的误解。 我认为唯一的假设是每个请求都是从一个线程提供的。我不明白这是如何消除的。 –