Java 检查servlet是否已经在处理的一种方法-j2ee?

Java 检查servlet是否已经在处理的一种方法-j2ee?,java,servlets,jakarta-ee,Java,Servlets,Jakarta Ee,我在一个名为“myServlet”的servlet中执行一些数据处理(例如),有时我会同时收到很多数据要处理,我的意思是,在同一时间,我需要一种方法告诉客户机服务器正忙 我尝试在应用程序启动时将ServletContext中的属性初始化为false,然后每当我收到请求时,我都会检查该属性是否为false,如果是这种情况,我会将其更改为true,然后进行处理,这样,只要我在处理,下一个请求就会被丢弃。同样,当我同时接收多个请求时,服务器会同时处理它们,我认为即使在我将ctx属性更改为TRUE之前,

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

我尝试在应用程序启动时将ServletContext中的属性初始化为false,然后每当我收到请求时,我都会检查该属性是否为false,如果是这种情况,我会将其更改为true,然后进行处理,这样,只要我在处理,下一个请求就会被丢弃。同样,当我同时接收多个请求时,服务器会同时处理它们,我认为即使在我将ctx属性更改为TRUE之前,某些请求也会逃逸。。。。我想我错过了什么

这就是我想知道是否有方法来检查是否已经有数据处理,这样我就停止了,并将服务器繁忙响应发送给客户端

希望你们能理解这个想法(问题)


提前感谢…

您可以使用
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是线程安全的,但
Boolean
Boolean
不是。您还需要synchornization(synchronized块),以确保在正在进行的处理过程中向reuqest告知正确的状态

因为:

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

创建一个返回进程状态的servlet端点。然后,客户机应该每隔一段时间或根据需要轮询端点以获取状态。在后端,编写代码来处理状态这是个好主意,问题是我无法控制客户端的代码,客户端使用api将数据发送到服务器。!!谢谢你,但是你不认为这和上下文中的属性是一样的吗,我将用可重入锁替换布尔值?不,不是。这个例子真的可以满足你的需要。好吧,很抱歉让你生气,但我还是不明白为什么它不同?如果你能澄清一点!!!还有一个想法:),您认为最好将锁作为静态存储在某处,还是通过servlet上下文将其作为属性传递?这取决于您的需要,在简单的场景中,我会将其存储在静态final字段中,但可能有理由以其他方式进行。如果静态场是足够的,我认为它是更好的,因为简单。