【发布时间】:2016-12-27 16:47:09
【问题描述】:
我有一个查询来回答远程客户的标准请求。标准,因为它不需要来自服务器外部的参数。每当
任何人向 URL 提交请求,例如 http://www.example.com/query,他/她会在响应正文中获取 reply.xml 的内容,
取决于当时数据库提供的内容。
reply.xml 的内容仅在服务器上的数据库内容中发生变化,不会在任何外部内容上发生变化
就像谁进行查询,输入哪个等,因此不会从客户端获取任何参数。我什至没有检查任何身份验证——我们将所有内容都留给了防火墙。
所以我写了一个@POST 方法,比如query(),以便在发布到http://www.example.com/query 的此类请求上被调用,并传递结果。我使用了Jersey,一切都符合规格,除了
请求应该是跨时间排他的。
也就是说,一次应该服务一个请求——除非服务器没有运行由我的方法query() 调用的查询过程,否则后续用户单击应该会收到一条HTTP 状态为309 的消息。
如何做到这一点?我尝试让query() 服务@PUT 而不是@POST 响应,并得到了相同的结果。
也许是关于这个话题的一个天真的问题。但是,对 Restful 服务不是很熟悉。
我可以通过对令牌进行线程化来控制一次只运行一个查询并让同时请求接收 HTTP 309 来做到这一点。但是必须有一种更好、更简单的方法来在服务器上实现这一点。
我使用的是 Tomcat 8,泽西岛 1.19。
TIA。
注意:我已经阅读了PUT vs POST in REST 以及其他一些有用的讨论。
//=======================
编辑:
哪个用户提交查询在任何时候都没有任何区别。
假设userA 提交了一个查询。虽然该查询仍在运行,即在query() 返回对userA 的响应之前,userB 提交了一个查询。 userB 应该得到一个 309——只是因为当时正在处理一个查询。
userA = userB 或 userA userB 在这里无关紧要,应该返回 309,因为有一个查询请求,而查询请求已经在运行。这是用户获得 309 的唯一一次。
//=============================================== =
EDIT-2:
我知道带有并发控制的解决方案。我猜有一个使用 Restful 功能。这是一个学术问题。
【问题讨论】:
-
您希望针对不同用户或再次运行查询的同一用户的查询为 309?
-
@RealSkeptic 是否是相同/不同的用户并不重要。请在 Q 中查看我的编辑。
-
好吧,如果它们在同一个 JVM 中运行,我想你可以使用 ReentrantLock。
-
@RC 费率无关紧要。我们不应该限制它。我们唯一应该避免的是我在 Q 中所说的同时发生的事情。