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