2016-08-20 56 views
1

我有一个资源,说服务客户端的@POST方法。它不会在任何外部参数上运行,甚至不会在呼叫者URL(我们将其留给防火墙)或用户身份验证中运行。有没有办法告诉servlet容器一次产生一个资源的实例?

但是,我们不想同时处理用户请求。当处理一个request1和方法还没有,只是还没有回来,一个请求2进来应该得到的地位309(或任何状态代码适用),不应该得到服务的响应。

有没有办法做到这一点,而不需要像多线程那样进入服务器后端?我使用Tomcat 8.应用程序

将部署在JBoss的,但是这不会影响结果(?)我用泽西1.19编码资源。

这是与How to ignore multiple clicks from an impatient user?相关的Q.

TIA。

+1

你能告诉我们更多关于你为什么要拒​​绝同时打来的电话吗?我可以想到很多用于序列化请求处理的用例,即一个接一个地提出响应,但为什么要求在请求正在处理时拒绝请求? –

+0

@jakeblues请参阅Q中指出的问题,可以有许多其他情况。这样的事情可以减轻后端的负担。感觉一个servlet容器提供了这个选项 - 不知道如何/在哪里。 – Roam

+0

@jakeblues寻找最重要的东西。我对Web服务不是很狡猾。 – Roam

回答

0

根据您想要实现的是,可以在服务“正在使用”时拒绝其他请求。我不知道在servlet级别是否可行; servlet旨在为尽可能多的请求启动流程,例如,如果一个用户请求简单而另一个请求有困难,那么可以在处理困难请求时处理简单请求。

你可能不会希望仅仅因为一个服务正在使用中返回一个HTTP错误代码的主要原因是,该服务没有错误;它只是在使用中。想象一下,试图使用其他人正在使用的洗手间,而不是“正在使用”洗手间说“无序”。

另一个原因三思它处理任何其他请求拒绝请求的服务是它不能扩展。期。您将会有一些用户接受他们的请求,而其他用户则拒绝他们的请求,这似乎是随机的,而且这个比例越多,拒绝服务的用户越多。想想到电台打电话来尝试成为第9个来电者,发出忙音,然后一次又一次地回电,直到你通过。这对尝试赢取音乐会的免费门票有效,但对于您作为客户的业务来说效果不佳。

这就是说,我可能会采取一些办法来处理昂贵的,可能重复的请求。

如果你想避免急躁用户的多个相同/同时发生的请求,你最有可能有问题UX(例如网页按钮似乎并没有因处理滞后的点击时响应)。我会实现一个加载掩码或类似的东西,以防止多次点击,并通知用户的请求已收到并正在处理。加载/处理掩码具有额外的好处,即为用户提供一种抽象的轻松自信的感觉,即服务确实按预期工作。

如果出于某种原因无法控制为什么可能会触发来自同一个源的多个相同请求,我会选择一个缓存,将处理结果返回给所有请求,但仅处理第一个请求(和从缓存中检索所有其他请求的响应)。

如果你真的想返回错误,请实现记住一些数字请求的高速缓存单独服务,检测重复,并适当地处理它们。

请记住,如果您的用例确实是来自浏览器的多次点击,那么您可能希望响应上次发送的请求,而不是第一次。如果用户点击了两次,浏览器将首先注册错误响应(它会立即返回,作为对最后一次点击的响应)。这可能会进一步破坏UX:单击会导致延迟,但是两次点击会导致错误。

但是在实现一个返回错误的服务之前,请考虑以下几点:如果两个不同的用户同时请求相同的资源?应该真的得到一个错误回应?如果在特定时间内请求数量增加会怎样?你真的想要将错误返回到相当于随机选择的服务消费者吗?

相关问题