3

問題

当社の liferay システムは、他の Web アプリケーションとデータを同期するための基盤です。
そしてModel Listeners、その目的のために使用します。
リスナーを介した Web サービスの呼び出しとデータベースの更新が多数あるため、liferay の特定のアクションが遅すぎます。

例: liferay に を 追加Userする場合、多くの Web サービス呼び出しを起動して、ユーザーの詳細を追加し、他のシステムをユーザーデータで更新し、いくつかの liferay カスタム テーブルも更新する必要があります。そのため、ユーザーの追加に時間がかかり、まれにリクエストがタイムアウトになることがあります。
のコードUserListenerはユーザーの詳細のみに依存し、例外があったとしてもUserListenerユーザーは Liferay に追加されるため、次の解決策を考えました。

また、リスナーでコードを実行中に例外が発生した場合に問題を修正する、liferay のスケジューラーもあります。

提案された解決策

UserListenerConcurrency API を使用してコードを非同期にすることを考えました。

だからここに私の質問があります:

  1. モデル リスナーに並行コードを含めることは推奨されますか?
  2. はいの場合、トランザクションやその他のものなど、このコードを介して Liferay カスタム テーブルも更新すると、悪影響がありますか?
  3. このアプローチの他の一般的な長所と短所は何ですか?
  4. ユーザー エクスペリエンスを妨げることなく、他のシステムをリアルタイムで更新できる、他に良い方法はありますか?

この件についてご協力いただきありがとうございます

4

1 に答える 1

2

この問題を解決するために同時実行性を使用することは理にかなっています。

モデルを変更するスレッドで Web サービスを呼び出すなどの集中的な作業を行うことは、ユーザー エクスペリエンスに与える影響を除けば、実際には良い考えではありません。

モデルのリスナー内でスレッドを起動することは、やや複雑で保守が難しい場合があります。

Liferay のメッセージ バス パラダイムを使用して、切断されたメッセージ レシーバーにメッセージを送信し、モデル リスナーの呼び出しスレッドの外部ですべての集中的な作業を行うことができます。

メッセージ バスの詳細については、次を参照してください。

  1. メッセージバス開発者ガイド
  2. メッセージバス Wiki
于 2013-06-18T17:44:18.170 に答える