ElasticSearchを使用してドキュメントを比較するライブラリを作成しました。JSFアプリでは機能しますが、Webサービスでは機能しません。
どちらのアプリも同じロジックを備えています。最初にリポジトリを作成し(コンストラクターがハードコードされた場所からドキュメントのリストを読み込み、インデックスを作成します)、ユーザーが自分のドキュメントをリポジトリ内のドキュメントと比較できるようにします。JSFアプリはいくつかのGUIを提供しますが、Webサービスレイヤーは非常に薄いです。起動時にリポジトリを作成し(ドキュメントの読み込みとインデックス作成)、比較リクエストをライブラリに渡します。
より複雑なJSFアプリは問題なく動作しますが、Webサービスアプリは読み込まれず(つまり、ドキュメントのインデックスも作成されない)、ロックの重複に問題があります。(両方を同時にではなく、どちらか一方のアプリをデプロイすることに注意してください。データはアプリによって共有されません。同じライブラリを使用していても、JSFアプリは機能するのに対し、もう一方は機能しないため、JSFアプリについて説明します。 )。
JSFアプリとWebサービスの違いは、前者が機能するのに対し、後者は機能しないということです。
ここにいくつかの詳細があります(少し簡略化/変更)
Webサービス:
@WebService(serviceName = "RepositoryWebService")
public class RepositoryWebService {
private static Repository repository = Repository.getInstance();
// some web methods (irrelevant since I never get that far)
}
public class Repository {
private final static Repository instance = new Repository();
public static Repository getInstance() {
return instance;
}
:
}
JSFアプリがアクセスすると、リポジトリのシングルトンインスタンスも作成されます(@ApplicationScoped
Beanを使用)。
Webサービスで得られる例外は次のとおりです。
java.nio.channels.OverlappingFileLockException
at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) [rt.jar:1.7.0_04]
:
at java.nio.channels.FileChannel.tryLock(FileChannel.java:1154) [rt.jar:1.7.0_04]
at org.apache.lucene.store.NativeFSLock.obtain(NativeFSLockFactory.java:217) [lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12]
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:80) [elasticsearch-0.19.11.jar:]
at org.elasticsearch.node.internal.InternalNode.<init>(InternalNode.java:125) [elasticsearch-0.19.11.jar:]
at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.java:159) [elasticsearch-0.19.11.jar:]
at org.elasticsearch.node.NodeBuilder.node(NodeBuilder.java:166) [elasticsearch-0.19.11.jar:]
at org.abc.Repository.<init>(Repository.java:56) [repository.jar:]
:
でelasticsearch.yml
、私は(とりわけ):
node.max_local_storage_nodes: 1
index:
number_of_shards: 1
number_of_replicas: 0
glassfish3.1.2とJBoss7.1.1の両方を試しましたが、同じ結果になりました。JDK1.7.0_0764ビットWindows7の両方。
私が間違っていることを提案していただければ幸いです。
アップデート:
すべての依存jar(elasticsearch *、jna *、log4j *、lucene *、snappy-java *、および私のjar)をドメインのlibディレクトリ(Glassfish上)に配置すると機能します。jarファイルがwarファイルの一部にすぎない場合はそうではありません。
何が起こっているのかわからない。これは、ネイティブライブラリのインスタンスが1つだけJavaにロードされるという事実に何らかの形で関係しているかもしれませんが、jnaとsnappy-javajarだけを配置するだけでは不十分でした。