从Async方法访问Neo4j

时间:2016-02-16 16:21:52

标签: java spring-data spring-data-neo4j-4

我的Web应用程序使用Neo4j作为数据存储,它使用Spring Data Neo4j 4框架。

正如教程中所建议的,我的neo4j会话绑定到我的HTTP会话:

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
    return super.getSession();
}

我有一个运行耗时查询的端点,并将结果脱机发送。我想将此方法移动到@Async线程,但显然我无法从该线程访问我的neo4j会话。

在不改变“主”会话bean范围的情况下,在HTTP会话之外访问neo4j存储库的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

我不确定最佳做法,但您是否只能使用sessionFactory#openSession()方法创建另一个会话?并将该新会话传递给另一个neo4jOperations实例(如果不使用它,则@Override现有bean),从而避免使用proxyScoped Neo4jConfiguration#getSession()方法。

像这样:

// note below assumes you are extending Neo4jConfiguration

// ... 

// passing in your own non proxyScoped session. 
// @Override existing neo4jTemplate @Bean passing in your own session

@Bean
@Override
public Neo4jOperations neo4jTemplate() throws Exception {
    return new Neo4jTemplate(getSessionFactory().openSession());
}

// or create another neo4jTemplate instance that avoids getSession() proxyScope method usage in its constructor. 

@Bean("nonProxyScopedNeo4jOperations")
public Neo4jOperations nonProxyScopedNeo4jTemplate() throws Exception {
    return new Neo4jTemplate(getSessionFactory().openSession());
}

// ...

并使用自定义neo4jOperations bean来执行@Async逻辑

请参阅Neo4jConfiguration

答案 1 :(得分:1)

我最终将我的neo4jSession移动到thread范围。由于我们的申请是无国籍的,我们的session只有一个request。并且由于每个请求都在一个单独的线程中处理,thread范围是最简单的方法。

我要感谢https://github.com/devbury/spring-boot-starter-threadscope的开发人员,让我的生活更轻松。 :)