2

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アプリがアクセスすると、リポジトリのシングルトンインスタンスも作成されます(@ApplicationScopedBeanを使用)。

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だけを配置するだけでは不十分でした。

4

2 に答える 2

1

それが役立つかどうかはわかりませんが、ここにいくつかの考えがあります:

  • Web サービス クラスの複数のインスタンスが読み込まれているようです。Repository.getInstance() が正常に動作していることは確かですか?
  • 動作するデモ プロジェクト (webapp - REST Webservice + 組み込み ES) があります: (このコードを見てください)。このプロジェクトには Spring を使用し、Elasticsearch Spring Factory: Spring ElasticSearchを使用しました。

お役に立てれば。

于 2012-11-02T03:02:29.063 に答える
0

JSF アプリケーションと Web サービス アプリケーションの両方で、メソッド呼び出しなどの後にリストをロードしているようです。最後の例では、アプリケーションをデプロイするときにデータをロードする必要があります。このために、 a を記述し、メソッドServletContextListenerにデータをロードします。contextInitialized

ServletContextListener、すべてServletの が Web アプリケーションにロードされる前にロードされます。これにより、すべての Web サービス メソッドが準備済みデータにアクセスできるようになります。

ServletContextListener:

Web Service クラスからにアクセスする必要がある/したい場合はServletContext、この文を設定することでアクセスできます

@WebService(serviceName = "RepositoryWebService")
public class RepositoryWebService {

    @Resource
    private WebServiceContext wsContext;

    @SuppressWarnings("unused")
    private ServletContext getServletContext() {
        return (ServletContext)wsContext.getMessageContext()
            .get(MessageContext.SERVLET_CONTEXT);
    }

    //your web methods here...
}
于 2012-11-02T01:26:05.573 に答える