7

私は、通常の操作中に正常に動作するSpring Data Neo-4jアプリケーション(Webベースではない)を実行しています。

Spring Context'ctx.close()'を閉じると、neo4Jデータベースのロックが解除されます。

次に、アプリケーションの同じインスタンスから、別のコンテキストを取得すると、ロックが戻ってくるのがわかりますが、そのコンテキストからそのデータベースから読み取り/書き込みを行おうとすると、エラーが発生します。

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.

アプリケーションの単一インスタンス内で(つまり、仮想マシンをシャットダウンせずに)アプリケーションコンテキストを正常に閉じてから再度開く方法はありますか?

最初はグラフデータベースでshutdown()を呼び出していましたが、Michael Hungerがそうしないように言ったので、これを変更しました。

私たちの問題は、このように私たちのドメインで再現することができます。

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);

コンテキストの作成に使用するXMLファイルは次のとおりです。

<?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>
4

2 に答える 2

3

そうすべきではありません。あなたの場合、spring-contextがライフサイクルを処理する必要があります。

ケースを再起動するとどうなりますか?

アプリケーションコンテキストをシャットダウンします

ctx.close()

おそらく、WebApplicationContext(Utils)を使用して、web.xmlを介して構成済みのSpringコンテキストを取得する必要があります。このような:

WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 
于 2013-02-05T11:59:32.577 に答える
0

私の最後のコメントとあなたの回答を見て、私の完全な回答を編集しました。

以下の 2 つの主要なファイル。

最初のものは使用しますWrappingNeoServerBootstrapper

既にインスタンス化された {@link org.neo4j.kernel.GraphDatabaseAPI} とオプションの構成を取得し、そのデータベースを使用してサーバーを起動する Neo4j サーバーのブートストラップ。これを使用して、すでに {@link EmbeddedGraphDatabase} または {@link VeryAvailableGraphDatabase} を使用しているアプリケーション内から完全な Neo4j サーバーを起動します。これにより、アプリケーションは、サーバーの REST API、Web 管理インターフェース、および統計追跡の利点を最大限に活用できます。

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());
        }
    }
}

アプリケーション コンテキスト定義 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>

これが役立つことを願っています。

于 2013-02-13T19:17:59.930 に答える