3

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

我尝试了制作方法synchronized,但没有奏效。

4

1 回答 1

2

与其尝试使用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到您的服务类构造函数中,并获取您需要的属性作为服务类的成员字段,以使其更方便。

于 2013-09-21T16:25:16.397 回答