【问题标题】:how to I make sure that only one servlet(not instance) is call at a time?如何确保一次只调用一个 servlet(不是实例)?
【发布时间】:2017-01-02 09:24:20
【问题描述】:

我有一个应用程序可以进行大量的多个 servlet 调用。如何确保在完成特定的 servlet X 处理之前不会调用 Y、Z 的其他 servlet 实例。

SingleThreadModel 或同步将确保每个 servlet 只调用一个线程。但是,这可能不适用于多个 servlet。

【问题讨论】:

  • 每个 servlet 都可以向应用程序上下文键添加一个标志,并且您可以使用一个过滤器来检查此属性。
  • 为什么你会要求某人其他所有人被允许使用所有其他页面之前发出一个使用servlet X的HTTP请求您的系统,使用 servlet Y、Z、...?这没有任何意义。
  • 我有一个场景,我想通过清除 cookie 来清除会话。当我使用 servlet 清除 cookie 时,我想确保另一个 servlet 不携带它。
  • cookies 保存在客户端。所以同时在两个客户端清除它们应该是没有问题的。

标签: java servlets jakarta-ee


【解决方案1】:

对每个服务器调用使用回调机制。如果第一个服务器调用成功,您可以调用第二个。

【讨论】:

  • 我是如何实现它的。 function successCallback(response) { if(condition){ 调用另一个 servlet。 } 作品
【解决方案2】:

您可以通过定义自己的锁来实现手动同步。

例如声明一个静态对象用作信号量:

public static final Object MY_LOCK = new Object();

你想同步的地方可以这样使用:

public void someMethod() {
    synchronized(MY_LOCK) {
        // do stuff that may not be called at same time
    }
}

public void someOtherMethod() {
    synchronized(MY_LOCK) {
        // do other stuff that may not be called at same time
    }
}

这样您就可以在不同的方法(或您的情况下的 servlet)中使用相同的锁。

【讨论】:

  • 但我必须说,很难想象你为什么要这样做。这是可行的,但非常不寻常。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2011-05-09
  • 2020-06-01
  • 1970-01-01
  • 2018-12-14
  • 2012-11-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多