4

Tomcat に Spring ベースの Web アプリケーションをデプロイしており、接続する mongo データベースのオプションをユーザーに提供したいと考えています。これを行うために、オンライン フォームを通じてユーザーから mongo 接続の詳細を取得するセットアップ ウィザードがあります。これらの詳細をキャプチャした後、Mongo に動的に接続したいと考えています。現在、xml 構成を介して mongo をロードしています。

<bean id="configmapper" class="com.db.util.ConfigurationMapper" />
<bean id="configmap" factory-bean="configmapper" factory-method="readXML" />
<mongo:mongo host="#{configmap.getHost()}" port="#{configmap.getPort()}" />
<mongo:db-factory dbname="#{configmap.getName()}"
    mongo-ref="mongo" />

ユーザー値は構成マッパー Bean によって読み取り/書き込み可能に保存されますが、それらを設定した後、基本的に mongo ドライバーを「再起動」します。これを行うために、次のことを試みています。

XmlWebApplicationContext context = ((XmlWebApplicationContext) ContextLoader
            .getCurrentWebApplicationContext());
context.refresh();

これにより、すべての applciation Bean がリロードされ、Mongo Bean がコンテキスト内の他のすべての Bean と一緒にログに再作成されていることがわかります。

DEBUG 2015-05-12 21:09:29,590 [http-nio-8087-exec-6] (DefaultSingletonBeanRegistry.java:221) - Creating shared instance of singleton bean 'mongo'
...
DEBUG 2015-05-12 21:09:08,121 [localhost-startStop-1] (DefaultSingletonBeanRegistry.java:221) - Creating shared instance of singleton bean 'mongoTemplate'
...
DEBUG 2015-05-12 21:09:29,590 [http-nio-8087-exec-6] (AbstractAutowireCapableBeanFactory.java:449) - Creating instance of bean 'mongoDbFactory'

ただし、接続を使用すると、次のスタックトレースが得られます。

Caused by: java.lang.IllegalStateException: open
    at org.bson.util.Assertions.isTrue(Assertions.java:36)
    at com.mongodb.DBTCPConnector.isMongosConnection(DBTCPConnector.java:367)
    at com.mongodb.Mongo.isMongosConnection(Mongo.java:622)
    at com.mongodb.DBCollection.findOne(DBCollection.java:936)
    at com.mongodb.DBCollection.findOne(DBCollection.java:914)
    at com.mongodb.DBCollection.findOne(DBCollection.java:858)
    at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2069)
    at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2053)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1828)
    at org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1645)
    at org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:560)

mongo 接続が適切に閉じられていない可能性があると考えたため、mongo Bean を取り込み、リロードする前に閉じました。

@Autowired
private Mongo mongo;
...
mongo.close();
XmlWebApplicationContext context = ((XmlWebApplicationContext) ContextLoader
                .getCurrentWebApplicationContext());
context.refresh();

しかし、同じ例外を受け取ります。

アプリサーバーを再起動せずに動的なmongo再接続を実現する方法を知っている人はいますか? おそらく、この問題に対処する別の方法がありますか? 構成ファイルを自分で編集するのではなく、エンドユーザーに GUI Web 構成を提供したいと考えています。

あなたが提供できるアドバイスをありがとう。

4

1 に答える 1