如何使Jersey Rest POST请求同步

时间:2013-09-21 07:28:32

标签: java rest jersey

如何使Jersey REST POST请求同步,以便在一个请求正在进行时,不能进行其他请求。

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

1 个答案:

答案 0 :(得分: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添加到服务类构造函数中,并获取所需的属性作为服务类的成员字段,以使其更方便。