java spring-mvc neo4j spring-data spring-data-neo4j

java - Cómo cerrar y volver a abrir los contextos de Spring Data Neo4J sin matar a la VM



spring-mvc spring-data (2)

No deberías hacer eso, en tu caso el contexto de primavera debería manejar el ciclo de vida.

¿Qué sucede cuando reinicias en tu caso?

Usted cierra el contexto de la aplicación con

ctx.close()

Probablemente deberías utilizar un WebApplicationContext (Utils) para obtener tu Spring Context configurado a través de tu web.xml. Me gusta esto:

WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

Estoy ejecutando una aplicación de datos de primavera neo-4j (no basada en web) que funciona bien durante el funcionamiento normal.

Si cierro el contexto de Spring ''ctx.close ()'', el bloqueo en la base de datos neo 4J desaparece.

Luego, desde la misma instancia de la aplicación, si tomo otro Contexto, veo que vuelve el bloqueo, pero si intento leer / escribir desde esa base de datos desde ese contexto, aparece un error:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ''org.springframework.data.neo4j.config.Neo4jConfiguration#0'': Unsatisfied dependency expressed through bean property ''conversionService'': : Error creating bean with name ''mappingInfrastructure'' defined in class org.springframework.data.neo4j.config.Neo4jConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final org.springframework.data.neo4j.support.MappingInfrastructureFactoryBean org.springframework.data.neo4j.config.Neo4jConfiguration$$EnhancerByCGLIB$$64cefd6f.mappingInfrastructure() throws java.lang.Exception] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''typeRepresentationStrategyFactory'' defined in class org.springframework.data.neo4j.config.Neo4jConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory org.springframework.data.neo4j.config.Neo4jConfiguration$$EnhancerByCGLIB$$64cefd6f.typeRepresentationStrategyFactory() throws java.lang.Exception] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''graphDatabaseService'': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.neo4j.kernel.EmbeddedGraphDatabase]: Constructor threw exception; nested exception is java.lang.IllegalStateException: Unable to lock store [C:/app_data/gelato/data/neostore], this is usually a result of some other Neo4j kernel running using the same store.; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''mappingInfrastructure'' defined in class org.springframework.data.neo4j.config.Neo4jConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final org.springframework.data.neo4j.support.MappingInfrastructureFactoryBean org.springframework.data.neo4j.config.Neo4jConfiguration$$EnhancerByCGLIB$$64cefd6f.mappingInfrastructure() throws java.lang.Exception] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''typeRepresentationStrategyFactory'' defined in class org.springframework.data.neo4j.config.Neo4jConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory org.springframework.data.neo4j.config.Neo4jConfiguration$$EnhancerByCGLIB$$64cefd6f.typeRepresentationStrategyFactory() throws java.lang.Exception] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''graphDatabaseService'': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.neo4j.kernel.EmbeddedGraphDatabase]: Constructor threw exception; nested exception is java.lang.IllegalStateException: Unable to lock store [C:/app_data/gelato/data/neostore], this is usually a result of some other Neo4j kernel running using the same store.

¿Hay alguna manera de cerrar con éxito y luego volver a abrir el contexto de la aplicación dentro de una sola instancia de una aplicación (es decir, sin apagar la máquina virtual)?

Inicialmente estaba llamando a shutdown () en la base de datos de gráficos, pero cambié esto porque Michael Hunger me dijo que no lo hiciera.

nuestro problema puede ser reproducido en nuestro dominio de esta manera.

AbstractApplicationContext ctx = new FileSystemXmlApplicationContext("neo4jconfig.xml"); OurDomainService domainService = (OurDomainService) ctx.getBean(OurDomainServiceImpl.class); // This works domainService.save(data); // this releases the lock ctx.close(); // this re-creates the lock and the context looks actvive ctx = new FileSystemXmlApplicationContext("neo4jconfig.xml"); domainService = (OurDomainService) ctx.getBean(OurDomainServiceImpl.class); // this errors out domainService.save(data);

Aquí está el archivo XML que usamos para crear el contexto.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:neo4j="http://www.springframework.org/schema/data/neo4j" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:spring-configured/> <context:annotation-config/> <context:component-scan base-package="OurData" /> <neo4j:config storeDirectory="c:/app_data/data"/> <neo4j:repositories base-package="OurData"/> </beans>


Mirando mi último comentario y sus respuestas han editado mi respuesta completa.

Los dos archivos principales a continuación.

El primero usa WrappingNeoServerBootstrapper

Un programa de arranque para el servidor Neo4j que toma una {@link org.neo4j.kernel.GraphDatabaseAPI} ya instanciada, y una configuración opcional, y ejecuta un servidor usando esa base de datos. Úselo para iniciar un servidor Neo4j completo desde una aplicación que ya usa la {@link EmbeddedGraphDatabase} o la {@link HighlyAvailableGraphDatabase}. Esto proporciona a su aplicación todos los beneficios de la API REST del servidor, la interfaz de administración web y el seguimiento de estadísticas.

package sandbox; import org.neo4j.server.WrappingNeoServerBootstrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.support.Neo4jTemplate; public class GalaxyServiceTest { private final static Logger slf4jLogger = LoggerFactory.getLogger(GalaxyServiceTest.class); @Autowired private GalaxyService galaxyService; @Autowired private Neo4jTemplate template; public static void main(String args[]) throws InterruptedException { GalaxyServiceTest main = new GalaxyServiceTest(); ApplicationContextLoader loader = new ApplicationContextLoader(); loader.load(main, "/spring/helloWorldContext.xml"); // The server starts with loading of above Context.xml WrappingNeoServerBootstrapper neoServer = loader.getApplicationContext().getBean("serverWrapper", WrappingNeoServerBootstrapper.class); //process something in repository main.doSomething(); // do a graceful stop int stop = neoServer.stop(0); slf4jLogger.info("stopping Server status code {} ", stop); //Restart the server neoServer.start(); slf4jLogger.info("Restarting Server "); // Process something in Repository main.doSomething(); } public void doSomething() { galaxyService.makeSomeWorlds(); Iterable<World> allWorlds = galaxyService.getAllWorlds(); for (World world : allWorlds) { slf4jLogger.info("World Name is {}", world.toString()); } } }

La aplicación Context definition xml

<context:annotation-config /> <context:spring-configured/> <context:component-scan base-package="sandbox" /> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"> <bean id="jotm" class="org.springframework.data.neo4j.transaction.JotmFactoryBean"/> </property> </bean> <neo4j:config graphDatabaseService="graphDatabaseService" /> <bean id="serverWrapper" class="org.neo4j.server.WrappingNeoServerBootstrapper" init-method="start" destroy-method="stop"> <constructor-arg ref="graphDatabaseService" /> </bean> <bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase" destroy-method="shutdown"> <constructor-arg value="target/test-db"/> </bean> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <neo4j:repositories base-package="sandbox"></neo4j:repositories> </beans>

Espero que esto ayude.