【问题标题】:Recognize each request thread in Servlet识别 Servlet 中的每个请求线程
【发布时间】:2011-10-13 09:07:44
【问题描述】:

有什么方法可以阻止新客户端对 servlet 的请求,直到旧客户端请求在 servlet 中完成执行?我不想使用synchronized 关键字,而是想识别servlet 中的每个请求线程。我怎样才能做到这一点?

【问题讨论】:

  • 我很难理解这个要求。您真的想在应用程序范围内将 servlet 的使用限制为 1 个同时请求吗?或者您想在会话范围内限制为 1 个请求? (即每个浏览器会话 1 个同时请求)?无论如何,为什么?你的servlet不是线程安全的吗?或者它是一个长期运行的工作,在完成之前不应该重新执行?
  • 亲爱的 BalusC ,我想要的是 : ,我怎样才能识别到我的 servlet 的每个线程?并以我喜欢的方式管理他们
  • 是的,我明白你在“我如何实现这个解决方案?”,但我不明白你真正需要什么 如“什么是正确的解决方案?”。功能要求完全不清楚。我不想发布如何实现完全错误的解决方案的答案。

标签: java multithreading servlets


【解决方案1】:

乍一看,我猜应该可以在上下文中存储一个布尔值。 任何到达的请求都会检查 context-bool(我们将其命名为“bBusy”)。 第一个到达的请求设置它并在它被处理后重置它。 第二个到达的检查:如果第一个仍在处理中,它将被识别,然后取决于您的幻想会发生什么...... :)

我希望这就是你的想法?

编辑: 它必须是正确的上下文。我的 Servlet 时代有些久远了……我猜是 ApplicationContext? - 不确定,但你应该能够自己找到它。

【讨论】:

  • 到目前为止你的想法很好,但你的意思是在 servlet 上下文中存储布尔值吗?
  • 但是第二个问题呢,当我在我的 Web 应用程序中使用关键字 assert 时它不起作用:(
  • ServletContext 是可能的。请求共享任何上下文。我已经有一段时间没有对 servlet 做任何事情了,很抱歉,我的记忆力正在衰退。我不知道那个断言 - 你遇到的问题,抱歉。
【解决方案2】:
  1. 在您的 servlet 或过滤器中使用 synchronized 关键字。在 servlet 方法中您可以编写:

    同步(这个){ //处理将要执行的请求的代码 //一次只有一个线程/请求 }
  2. 您可以使用为您提供同步的对象(取决于您的需要) - 请参阅 java.util.concurrent

  3. 您可以尝试在不使用原语的情况下使用线程同步算法。 (CS 类通常会告诉这样的算法)

  4. 您可以尝试将服务器配置为按顺序执行请求。 见http://tomcat.apache.org/tomcat-6.0-doc/config/executor.html

【讨论】:

  • @Tahani 写道:“请不要让我使用同步关键字”;)
【解决方案3】:

在同步块中的servletcontext中保留一个AtomicBoolean/volatile可以达到效果。另一种方法是使用 SingleThreadModel 接口(已弃用),但它仍然可以完成工作。

我仍然想知道你为什么要这样做。

您可以在 Web 应用程序代码(servlet 等)中使用断言。但请确保使用 -ea 或控制断言的相应参数启动 web/app 服务器。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2013-09-29
  • 2018-03-13
相关资源
最近更新 更多