我已将 Neo4j 连接添加到一个简单的 Spring Boot 命令行应用程序——它实现了CommandLineRunner
.
我几乎遵循了Neo4j 驱动程序手册中的示例,但我的应用程序在完成后不会终止main()
。
与这些来源的唯一偏差是该driver.close()
方法不是在main()
最后调用,而是在一个带@PreDestroy
注释的方法中:
@Service
public class DatabaseGraphService {
private volatile Driver driver;
private final Logger LOG;
public DatabaseGraphService() {
LOG = LogManager.getLogger(getClass());
}
@PostConstruct
private void initialize() throws Exception {
driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "neo4j"));
}
@PreDestroy
public void close() throws Exception {
LOG.info("Shutting down Neo4j driver...");
driver.close();
}
// ...
}
主类:
@SpringBootApplication(scanBasePackages={ "it" })
public class SpringBootConsoleApplication implements CommandLineRunner {
@Autowired
private DatabaseGraphService graphService;
private static Logger LOG = LoggerFactory
.getLogger(SpringBootConsoleApplication.class);
public static void main(String[] args) {
LOG.info("STARTING THE APPLICATION");
SpringApplication.run(SpringBootConsoleApplication.class, args);
LOG.info("APPLICATION FINISHED");
}
@Override
public void run(String... args) {
LOG.info("EXECUTING : command line runner");
}
}
我在 Sprint Tools Suite(基于 Eclipse 的 IDE)中运行它,它记录的内容如下:
i.c.c.e.SpringBootConsoleApplication : APPLICATION FINISHED
但仅此而已,该过程保持活跃;当我按下停止按钮时,然后:
inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.
i.c.c.services.DatabaseGraphService : Shutting down Neo4j driver...
com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
[...]
如果我在不执行任何查询的情况下运行程序,则该过程定期存在。只要我进行查询——无论我是使用所有结果还是对Result
对象不做任何事情——它都会保持活动状态。
难道我做错了什么?或者这可能是预期的行为,因为当main()
完成时它只是它的线程终止?
虽然,在同一个应用程序中,我连接到一个 PostgreSQL 实例,也在那里进行查询,但是在添加 Neo4j 连接之前应用程序正确终止。