1

私たちは、さまざまなクライアント向けのさまざまな同様のサブウィキを含むウィキ ファームに取り組んでいます。私が本当に苦労している課題は、サブウィキごとに異なる (Java ベースの) リスナーを登録したいということです。このようなリスナーの例として、保存イベントをリッスンしてウィキページのタイトルを変更するリスナーがあります。このために、サブウィキごとに異なるオブジェクトに格納されたモデル データを使用します。イベントがトリガーされるたびにこれらのモデルをリロードする必要がないようにするために、モデルを一度ロードして再利用したいと考えています。ただし、ここ数日、ウィキごとにリスナーコンポーネントを定義/登録する方法を検索しましたが、探しているものが見つかりません。

これらのリスナーをこのように構築する方法を理解するのを手伝ってくれる人はいますか? (たとえば) 例を教えてもらえますか?

どんな助けでも大歓迎です:-)

4

1 に答える 1

1

必要に応じて、少なくとも 2 つの主要なソリューションがある場合があります。

  1. ファーム全体にインストールされた単一のリスナーを使用し (Extension Manager を使用してファーム全体にインストールするか、「lib」フォルダーに jar をダンプするだけで)、現在の wikiID をキーとしてモデルのキャッシュを保持します。そうすれば、イベントをインターセプトするときに、リスナーは現在の wiki ID を (コンテキストまたは影響を受けるドキュメントの参照から) 取得し、それを使用してメモリ内モデルを検索するため、イベントごとにモデルを初期化する必要がなくなります。 . キャッシュは、単純なマップから、XWiki のキャッシュ モジュールを使用するなど、より構成可能でスケーラブルなソリューションまで、何でもかまいません。
  2. Wiki コンポーネント マネージャーを使用して、各 Wiki に 1 つずつ、リスナーの N インスタンスを実際に登録します。それを行うには、次のことができます。
    1. Extension Manager UI を展開して使用し、個々の wiki にコンポーネントをインストールします (ファーム全体ではなく、注意してください!)。コンポーネントを、サブウィキにインストールする UI/フレーバーの依存関係にすることで、これを簡素化できます。これにより、サブウィキの UI をインストールすると、サブウィキに自動的にインストールされます。このように、コンポーネントのコードは現在の wiki (インストールされているもの) のみを考慮し、現在の wiki のモデルのキャッシュのみを考慮します。
    2. または、プログラムによる方法では、既存の各ウィキを繰り返し処理し、それぞれについて、現在繰り返し処理されているウィキにコンテキスト ウィキを設定し、「ウィキ」ComponentManager を動的に取得します (「コンポーネント モジュール」のドキュメントで「名前空間コンポーネント マネージャー」を参照してください)。 )、リスナーの新しいインスタンスを作成し、それをその wiki コンポーネント マネージャーに登録します。このコードは、XWiki インスタンスの開始時に 1 回実行されます。ただし、これらのコンポーネント インスタンスの同期を維持する必要があり、新しい wiki が作成されるたびに、新しいリスナー インスタンスも登録する必要があります。このプロセスを簡素化する宣言型の方法 ATM はありません。

方法 2.2 は、たとえ可能であったとしても、不必要に複雑になるため、あまりお勧めしません。

方法 2.1 は最も簡単に記述できますが、展開するには少し作業が必要です (つまり、構成済みの Maven リポジトリまたは XWiki リポジトリ (「XWiki リポジトリ アプリケーション」も参照) でアーティファクトを使用できるようにする必要があります)。管理者がインストールできます)。

方法 1 は、実装も展開も簡単なので、ユースケースに適している場合はお勧めします。

編集:コメントに記載されているように、オプション 2 は現在サポートされていません。詳細については、 XCOMMONS-213を参照してください。

于 2016-03-07T19:44:29.997 に答える