2016-02-16 2 views
0

Мое веб-приложение использует Neo4j в качестве хранилища данных и использует фреймворк Spring Data Neo4j 4.Доступ к Neo4j из метода Async

Как было предложено в учебнике, моя Neo4j сессия связана с моей HTTP сессии:

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

У меня есть конечная точка, которая запускает запрос трудоемкого, и посылает результат в автономном режиме. Я хотел бы переместить этот метод в поток @Async, но, очевидно, я не могу получить доступ к моей сессии neo4j из этого потока.

Какова наилучшая практика доступа к хранилищам neo4j за пределами сеанса HTTP без изменения сферы действия «основного» сеансового компонента?

ответ

1

я в конечном итоге перемещение моего neo4jSession к thread области. Поскольку наше приложение является без гражданства, наш session является только одним request. И так как каждый запрос обрабатывается в отдельном потоке, то самым простым способом был охват области thread.

Я хотел бы поблагодарить разработчика https://github.com/devbury/spring-boot-starter-threadscope, облегчив мне жизнь. :)

+0

Привет, endrec, это будет очень полезно, если вы добавите фрагмент кода. –

+0

@AdamGhani Это было давно, но, как я помню, я не делал никаких изменений кода, просто добавил упомянутый проект как зависимость. – endrec

1

Я не уверен в лучшей практике, но не можете ли вы просто создать еще одну сессию из метода sessionFactory#openSession()? И передайте этот новый сеанс другому экземпляру neo4jOperations (или @Override существующего компонента, если он не используется), таким образом, избегая использования метода 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 боб для выполнения вашей логики @Async

см Neo4jConfiguration:

+0

Я думал о том, чтобы делать что-то подобное, но он просто не чувствовал себя хорошо ... Мне интересно, есть ли лучший/простой/eleganter (:))/более весёлый путь. – endrec

+0

@endrec после того, как 'getSession()' является прокси-сервером для HttpSession, он будет в этой области для жизни приложения и создаст новую сессию ne4j для каждого HttpSession. Я не думаю, что есть способ обойти это с помощью getSession. – Selwyn