如何防止Web服务API中的并发?

Mar*_*eon 6 java api rest concurrency web-services

我们有三个Web服务(/a,/b,/c),其中每个服务映射到一个方法(go())在一个单独的Java类(ClassA,ClassB,ClassC).

只有一个服务应该同时运行(即:/b运行时无法/a运行).但是,由于这是一个REST API,因此无法阻止客户端请求并发运行的服务.

服务器上最好和最简单的方法是什么,以强制服务不同时运行?


更新:这是一个内部应用程序,我们不会有大的负载,只有一个应用程序服务器.

更新:这是一个主观问题,因为您可以对影响最终答案的一般应用程序设计提出不同的论点.当我发现最有趣和最有帮助时,接受了翻译的回答.

duf*_*ymo 7

你的设计有缺陷.服务应该是幂等的.如果您所拥有的课程不支持,请重新设计,直到他们这样做.听起来三种方法中的每一种都应该是服务的基础,而不是类.


ove*_*ink 6

假设只强制Web服务器只有一个监听线程提供请求是不行的......我想我只是使用一个静态锁(ReentrantLock可能为了清楚起见,尽管你可以在任何共享对象上同步,真的):

public class Global {
  public static final Lock webLock = new ReentrantLock();
}

public class ClassA {
    public void go() {
        Global.webLock.lock()
        try {
            // do A stuff
        } finally {
            Global.webLock.unlock()
        }
    }
}

public class ClassB {
    public void go() {
        Global.webLock.lock()
        try {
            // do B stuff
        } finally {
            Global.webLock.unlock()
        }
    }
}

public class ClassC {
    public void go() {
        Global.webLock.lock()
        try {
            // do C stuff
        } finally {
            Global.webLock.unlock()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Marcus:是的,你可以使用synchronized而不是lock/unlock.例如,在上面的例子中,你可以使`webLock`成为一个简单的`Object`并使用`synchronized(webLock){...}`代替. (2认同)