当使用嵌入在tc服务器中的Neo4j时,实例数据库不会完全关闭
当tc服务器停止时(仅在STS中运行),shutdown()似乎没有在我的嵌入式neo4j数据库上正确调用 下面是我看到的日志消息:当使用嵌入在tc服务器中的Neo4j时,实例数据库不会完全关闭,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,当tc服务器停止时(仅在STS中运行),shutdown()似乎没有在我的嵌入式neo4j数据库上正确调用 下面是我看到的日志消息: 16:03:43.358 [localhost-startStop-1] INFO neo4j.xafactory - Non clean shutdown detected on log [/home/billy/target/data/graph.db/nioneo_logical.log.1]. Recovery started ... INFO: No
16:03:43.358 [localhost-startStop-1] INFO neo4j.xafactory - Non clean shutdown detected on log [/home/billy/target/data/graph.db/nioneo_logical.log.1]. Recovery started ...
INFO: Non clean shutdown detected on log [/home/billy/target/data/graph.db/index/lucene.log.1]. Recovery started ...
我在Spring论坛上搜索了类似的问题,结果发现
然而,我认为这与此无关,因为当上下文关闭时,Spring应该处理这个问题
<neo4j:config storeDirectory="target/data/graph.db"/>
<neo4j:repositories base-package="com.example.repository"/>
另外,请不要被我的日志消息所迷惑,我的数据库实际上不在webapps目录中。应用程序服务器上的应用程序路径实际上是:
/home/billy/DevTools/springsource/vfabric-tc-server-developer-2.8.2.RELEASE/base-instance/wtpwebapps
有没有其他人遇到过这个问题,并找到了解决方法?对于我的小示例应用程序来说,这不是什么大问题,但我不想看到我是否为我的生产应用程序选择了这种技术。Peter是对的。这不是Neo4j甚至Spring Neo4j的问题。显然,当在STS中运行tc服务器的本地开发人员副本并选择停止服务器时,STS硬杀死它,而不是发送关闭信号,否则会导致上下文破坏事件发送到dispatcher servlet。因此,不会在Spring上下文中调用生命周期事件,也不会清理任何内容。这确实应该是STS问题跟踪程序的一个问题。我很可能会在有时间的时候跟进此事。你确定这是Neo4j的问题吗?你能用一个空的Javabean和一个shutdown()方法以及一个日志打印输出来进行测试吗?可能是Tomcat没有正确调用Spring关机序列。Peter你是对的,这很可能不是Neo4j的问题。我没有在独立应用程序中看到这一点。它发生在我决定用SpringNeo连接一个web应用程序时。当我停止tc服务器时,似乎没有执行关机挂钩。我想我可以试着在Spring和Neo4j关闭方法中设置一些断点,看看当我停止服务器时是否真的碰到了它们。虽然我不确定这会有多好,因为事情正在关闭,但我会尝试一下,然后发回。我在STS中用一个TCServer实例运行了一个快速测试。我在Springbean中创建了@PreDestory方法,右键单击服务器并选择stop。未调用该方法。我暗自怀疑停止(而不是终止)只是在扼杀事物,而不是发出一个优雅的关机序列。到家后,我会尝试将应用程序部署到IDE中嵌入的应用程序服务器之外的应用程序服务器上,看看是否有什么乐趣。
private String handleStoreDir(Element element, ParserContext context, BeanDefinitionBuilder configBuilder) {
String storeDir = element.getAttribute("storeDirectory");
if (!hasText(storeDir)) return null;
BeanDefinitionBuilder graphDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(EmbeddedGraphDatabase.class);
graphDefinitionBuilder.addConstructorArgValue(storeDir);
graphDefinitionBuilder.setScope("singleton");
graphDefinitionBuilder.setDestroyMethodName("shutdown");
context.getRegistry().registerBeanDefinition(GRAPH_DATABASE_SERVICE, graphDefinitionBuilder.getBeanDefinition());
configBuilder.addPropertyReference(GRAPH_DATABASE_SERVICE, GRAPH_DATABASE_SERVICE);
return GRAPH_DATABASE_SERVICE;
}