2

Glassfish アプリケーション サーバーにデプロイされた Jackrabbit 2.2.6 ( webapp) を使用しています。また、サーバーによって公開された rmi インターフェイスを使用してサーバーにファイルをアップロードするためのクライアントも構築しています。標準の JCR API を使用して、クライアントからリモート サーバーにログインしてファイルをアップロードできます。ただし、リモートサーバーへのクエリに苦労しています(JCR-SQL2を使用しています)。リモート サーバーにクエリを実行するために使用しているコードのスニペットを次に示します。

public static List<Node> getNode(Session session, String q) {
    try {
        QueryManager qman = session.getWorkspace().getQueryManager();

        Query query = qman.createQuery(q, Query.JCR_SQL2);
        QueryResult result = query.execute();
        RowIterator rowIt = result.getRows();
        System.err.println("Found results " + rowIt.hasNext());
        List<Node> nList = new LinkedList<Node>();
        while (rowIt.hasNext()) {
            Row row = rowIt.nextRow();
            nList.add(row.getNode());
        }
        return nList;
    } catch (RepositoryException ex) {
        Logger.getLogger(BasicArtifacts.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;

}

これは、コードを実行したときに得られたものです。

javax.jcr.UnsupportedRepositoryOperationException: TODO: JCRRMI-26
    at org.apache.jackrabbit.rmi.client.ClientRow.getNode(ClientRow.java:70)

nList.add(row.getNode());のようです が犯人です。これは、Jackrabbit サーバーでリモート クエリを実行する最良の方法ではないようです。

ローカルの一時リポジトリで動作することを確認しました。

Jackrabbit のコード ベースを調べると、RemoteQuery と関連するクラスが見つかりました。私はいくつかのコードを書き込もうとしましたが、うまく機能させることができませんでした。ここにスニペットがあります

public static List<Node> getNode(Session session, String q) throws RemoteException {
    try {
        QueryManager qman = session.getWorkspace().getQueryManager();

        ServerAdapterFactory factory = new ServerAdapterFactory();
        RemoteQueryManager rqman = factory.getRemoteQueryManager(session, qman);
        RemoteQuery rquery = rqman.createQuery(q, Query.JCR_SQL2);
        //this is a basic query - not yet sure how to implement the constraints as yet.
        RemoteQueryResult rresult = rquery.execute();
        RemoteIterator rit = rresult.getRows();


        Object[] objs =  rit.nextObjects();
        System.err.println("Found results " + rit.getSize() );

        List<Node> nList = new LinkedList<Node>();

        for(Object obj:objs){

            //System.err.println(row.getPath());
            ServerRow row = (ServerRow)obj;
            for(Value val:row.getValues()){
                System.err.println("Value:"+ val.getString());
            }
            //How to get the Node out of the ServerRow?
            //nList.add(row.);
        }
        return nList;
    }
    catch (RepositoryException ex) {
        Logger.getLogger(UploadContentToRemote.class.getName()).log(Level.SEVERE, null, ex);

    }
    return null;

}

任意のヘルプ、ポインタをいただければ幸いです。ありがとう。

4

3 に答える 3

1

NodeIterator を使用してみましたか:

Query q = queryManager.createQuery(sqlText, Query.JCR_SQL2);
QueryResult result = q.execute();
NodeIterator iter = result.getNodes();
while (iter.hasNext()) {
   nList.add(iter.nextNode());
}

JackRabbit RMI を CRX バックエンドに使用していますが、これは機能します。

于 2011-07-13T20:26:31.157 に答える
0

クエリに関しては、XPath を使用することをお勧めします。技術的には非推奨ですが、コミュニティで広く使用されているようです。つまり、実装が完了し、広く使用されています。RMI リモート スタックでも同様に完全であると思われます。

あなたはすでにこれを知っているかもしれませんし、他の答えはこれをほのめかしていますが、このようなスレッドで言及されているように、jackrabbit の rmi リモート処理は実際の使用を意図していないようです。

davex リモーティングが推奨される方法のようです。これも完全に実装されているわけではありませんが、必要なすべてのことを実行するのに十分なようです。

于 2011-06-27T17:34:40.000 に答える
0

SQL2 は JSR-283 で導入されました。JSR-283 は、RMI では (まだ) 完全にはサポートされていません ( JCRRMI-26を参照)。

XPATH でクエリを再構成するか、リモート処理に RMI の代わりにDavExを使用することができます。

于 2011-06-17T11:59:15.083 に答える