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