【问题标题】:a way to check if the servlet is already processing - j2ee?一种检查 servlet 是否已经在处理的方法 - j2ee?
【发布时间】:2016-11-10 21:16:31
【问题描述】:

我有一些数据处理,我正在一个名为“myServlet”的 servlet 中执行(例如),有时我会同时收到很多数据来处理,我的意思是同时,我需要一种方法来告诉客户端服务器正忙。

我尝试在应用程序启动时将 ServletContext 中的一个属性初始化为 false,然后当我收到请求时,我检查该属性是否为 false,如果是这种情况,我将其更改为 true,然后我以这种方式处理只要我正在处理,下一个请求就会被丢弃。当我同时收到多个请求时,这再次无法正常工作,服务器同时处理它们,我认为一些请求甚至在我将 ctx 属性更改为 TRUE 之前就已经逃逸了......我认为我'我错过了一些东西

这就是我想知道是否有办法检查是否已经有数据处理,所以我停在那个点并将服务器繁忙的响应发送给客户端

希望你们有这个想法(问题)

提前谢谢...

【问题讨论】:

  • 创建一个返回进程状态的 servlet 端点。然后,客户端应该每隔一段时间或根据需要轮询端点以获取状态。在后端,编写代码来处理状态
  • 好主意,问题是我无法控制客户端的代码,它是客户端用来向服务器发送数据的 api。!!

标签: java servlets jakarta-ee


【解决方案1】:

您可以使用ReentrantLock(而不是上下文中的布尔值,在上下文中或某处持有此锁 - 它应该是所有对此 servlet 的请求的相同实例),您还需要同步锁定操作以确保如果您在服务器已经很忙的时候向任何会发出请求的人返回忙,请阅读该课程的 api 和示例,基本思想是:

 public class SomeService {

   private final ReentrantLock lock = new ReentrantLock(); // or store it in context based on your needs
   // ...

   /** this method refuse to process if there is already ongoing processing */
   public void heavyProcessing() {

     synchronized (lock) {
       if (lock.isLocked()) {
          // return busy status here
          return;     
       }

       lock.lock();  // acquire the lock - here we have the winner request that will be processed
     }
     try {
       // ... do the processing here
     } finally {
       lock.unlock()
     }
   }
 }

这都是因为“乱序执行”。 ReentrantLock 是线程安全的,但Booleanboolean 不是。您还需要同步(synchronized 块)以确保您将正确的状态告知正在进行的处理过程中的请求。

因为:

如果线程之间没有适当的同步,则无法保证 porgram 会按照其编写的确切顺序执行(如果不影响单线程程序,优化机制可以更改执行顺序)。为了防止这种OOE优化,您需要指定一些同步点。 ReenterantLock 的设计考虑到了这一点,boolean 不是。使用ReenterantLock 只是将这些同步点放入执行的代码中,因此您可以获得正确的同步。 java中的线程间同步是一个非常广泛的话题,我不能在这里教你怎么做。关于这个主题的一本好书是“Java Concurrency in Practice”。我建议先阅读这本书,然后在这里询问是否会令您感到困惑。

【讨论】:

  • 谢谢你,但你不认为这与上下文中的属性相同,我只是用 ReentrantLock 替换布尔值?
  • 不,不是。这个例子真的能满足你的需要。
  • 好的,抱歉打扰了,但我还是不明白为什么会有不同?如果你能澄清一点!!!
  • 再想一想:),您认为将锁作为静态存储在某处还是通过 servlet 上下文将其作为属性传递更好?
  • 这取决于您的需求,在简单的情况下,我会将其存储在静态最终字段中,但可能有理由以其他方式执行此操作。如果静态字段就足够了,我认为它会更好,因为它很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2017-02-24
  • 2012-07-07
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多