2013-11-22 8 views
5

Jackrabbitの実装として、RESTレイヤとバックエンドがあります。 TransientRepositoryをデフォルトの設定で使用しました。 2つのリクエスト(ノードの読み取りのみ)が同時に起動された場合、次のエラーが発生しています:既存のロックファイル{tomcat}/.lockが検出されました。リポジトリが正常にシャットダウンされませんでした。 javax.jcr.RepositoryException:.lockという名前のファイルがすでに現在のプロセスによってロックされているため、リポジトリのホーム{tomcat}が使用中のようです。同時アクセスのJackrabbitリポジトリロック

jackrabbit wikiページ:http://wiki.apache.org/jackrabbit/RepositoryLockは、リポジトリがすでに同じプロセスで開かれていても、別のクラスローダー(他のWebアプリケーションなど)内で開いている場合に発生します。この場合、Webアプリケーションが停止したときにリポジトリが閉じられるようにする必要があります。

我々は、リポジトリを取得し、セッションを作成するためのコードの下に使用している:

try { 
Repository repository = new TransientRepository(REPO_CONFIG_FILE, REPO_HOME_DIR); 
session = repository.login(new SimpleCredentials(REPOSITORY_USERNAME, REPOSITORY_PASSWORD.toCharArray())); 
} finally { 
    if(session != null){ 
     session.logout(); 
    } 
} 

上記のコードは、Jackrabbitのの操作のそれぞれのためのものであるので、セッションは、各操作の後に閉じられます。そしてそのJackrabbitリポジトリにアクセスするWebアプリケーションは1つだけです。

RepositoryLockページに示されている解決策は、Repository Serverの使用を提案しています。それがここの唯一の解決策ですか、私は設定やコーディング中に何かが欠けていますか?

答えて

1

たぶん、あなたは方法

loggedOut(SessionImplセッション) がオープンセッションのセットから与えられたセッションを削除を使用する必要があります。 このリポジトリ を指定するか、アプリケーションリスナーでRepository Serverを使用し、JNDIからRepository Serverを使用してアクセス可能にして、きれいに開始/停止できるようにしますか?

+0

質問にお答えいただきありがとうございます。私はTransientRepository.loggedOut(sessionImpl)メソッドを使って試してみましたが、同時に2つのリクエストを打つことでテストしましたが、RepositoryLock Exceptionを与えています。私はリポジトリサーバを持つ他のオプションを評価しますが、並列スレッドのシナリオは非常に一般的なように思えます。そのため、私が欠けている設定があるかどうか疑問に思っていました。 – averagejoe

関連する問題