我如何使Jersey REST POST请求同步,以便在处理一个请求时无法发出其他请求。

我尝试制作方法synchronized,但是没有用。

最佳答案

与其尝试对服务方法进行synchronize并根据每个请求启动/停止GraphDatabaseService,不如在GraphDatabaseService中启动ServletContextListener,然后通过Web应用程序的上下文进行访问,可能会很有趣。这利用了GraphDatabaseService是线程安全的事实。

也许这样的听众:

public class ExampleListener implements ServletContextListener {

  public void contextInitialized(ServletContextEvent sce) {
    sce.getServletContext().setAttribute("graphDb", new GraphDatabaseFactory().newEmbeddedDatabase("/tmp/GraphDB"));
  }

  public void contextDestroyed(ServletContextEvent sce) {
    ((GraphDatabaseService)sce.getServletContext().getAttribute("graphDb")).shutdown();
  }

}

您可以像这样在web.xml中进行初始化:

<listener>
  <listener-class>org.example.ExampleListener</listener-class>
</listener>

然后利用这样的REST方法:
@POST
public void graphOperation(@Context ServletContext context) {
  GraphDatabaseService graphDb = (GraphDatabaseService)context.getAttribute("graphDb");
  // Graph operations here...
}

您甚至可以将ServletContext添加到服务类构造函数中,并获得所需的属性作为服务类的成员字段,以使其更加方便。

10-06 02:50