如何使Jersey REST POST请求同步,以便在一个请求正在进行时,不能进行其他请求。
我尝试制作方法synchronized
,但它没有用。
答案 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
添加到服务类构造函数中,并获取所需的属性作为服务类的成员字段,以使其更方便。