登録イベントをリッスンする
メッセージングAPIは、宛先登録イベントおよびメッセージリスナー登録イベントのリッスンをサポートします。 これらのイベントをリッスンする理由は次のとおりです。
- 興味のあるメッセージを新しい宛先に送信する場合
- 宛先でのメッセージングに調整が必要な場合
- 未登録の宛先に依存する場合
- 登録を解除して再割り当て可能なリソースを解放する場合
サンプルプロジェクトは、これらの登録イベントをリッスンする方法を示しています。 サンプルを実行することから始めます。 次に、イベントリスナーの実装を調べます。 最後に、登録解除イベントをトリガーします。
サンプルでイベントをトリガーする
これらは、宛先の登録リスナー、メッセージリスナーの登録リスナー、そしてそれらがリッスンするイベントをトリガーするクラスをデプロイします。 新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.55-ga55。
http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順に従います。
サンプルをダウンロードして解凍します。
curl https://resources.learn.liferay.com/dxp/latest/ja/building-applications/core-frameworks/message-bus/liferay-s3z9.zip -O
unzip liferay-s3z9.zip
s3z9-able-impl
モジュールをデプロイして、メッセージバスイベントリスナーを起動します。cd liferay-s3z9/s3z9-able-impl
../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、モジュールJARをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。s3z9-baker-impl
モジュールをデプロイして、宛先を追加します。cd ../s3z9-baker-impl
../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
Dockerコンテナのコンソールには、新しく追加された宛先に対する
S3Z9AbleMessageBusEventListener
の応答が表示されます。[main][S3Z9AbleMessageBusEventListener:17] Destination added acme/s3z9_baker
s3z9-charlie-impl
モジュールをデプロイして、宛先イベントリスナーを起動します。cd ../s3z9-charlie-impl
../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
s3z9-dog-impl
モジュールをデプロイして、メッセージリスナーを宛先に登録します。cd ../s3z9-dog-impl
../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
Dockerコンテナのコンソールには、新しく登録されたメッセージリスナーに対する
S3Z9CharlieDestinationEventListener
の応答が表示されます。[S3Z9CharlieDestinationEventListener:23] Registered message listener to acme/s3z9_baker
モジュールの概要は次のとおりです。
s3z9-able-impl
のMessageBusEventListener
実装は、宛先の追加と削除をリッスンします。s3z9-baker-impl
のメッセージングコンフィギュレータクラスは宛先を追加します。s3z9-able-impl
のMessageBusEventListener
実装は、追加された宛先通知を受信し、イベントをログに記録します。s3z9-charlie-impl
のDestinationEventListener
実装は、宛先に登録するメッセージリスナー、または宛先から登録解除するメッセージリスナーをリッスンします。s3z9-dog-impl
のMessageListener
実装は宛先に登録されます。s3z9-charlie-impl
のDestinationEventListener
実装は、メッセージリスナー登録通知を受信し、イベントをログに記録します。
MessageBusEventListener
を調べる
宛先
が追加または削除されると、メッセージバスは MessageBusEventListeners
に通知します。 以下に、MessageBusEventListener
の実装例を示します。
@Component(service = MessageBusEventListener.class)
public class S3Z9AbleMessageBusEventListener
implements MessageBusEventListener {
@Override
public void destinationAdded(Destination destination) {
if (_log.isInfoEnabled()) {
_log.info("Added destination " + destination.getName());
}
}
@Override
public void destinationRemoved(Destination destination) {
if (_log.isInfoEnabled()) {
_log.info("Removed destination " + destination.getName());
}
}
private static final Log _log = LogFactoryUtil.getLog(
S3Z9AbleMessageBusEventListener.class);
}
@Component
アノテーションとそのservice = MessageBusEventListener.class
属性は、S3Z9AbleMessageBusEventListener
をMessageBusEventListener
として登録するようにランタイムフレームワークにシグナルを送信します。 実装は、MessageBusEventListener
の次の2つのメソッドをオーバーライドします。
destinationAdded(Destination destination)
は、新しく追加されたDestination
に応答します。destinationRemoved(Destination destination)
は、新しく削除された宛先
に応答します。
S3Z9AbleMessageBusEventListener
のメソッド実装は、宛先イベントをログに記録します。
DestinationEventListener
を調べる
メッセージバスは、DestinationEventListener
の指定した宛先に MessageListen
が登録されたり、登録解除されたりすると、 DestinationEventListener
に通知します。 以下に、DestinationEventListener
の実装例を示します。
@Component(
property = "destination.name=acme/s3z9_baker",
service = DestinationEventListener.class
)
public class S3Z9CharlieDestinationEventListener
implements DestinationEventListener {
@Override
public void messageListenerRegistered(
String destinationName, MessageListener messageListener) {
if (_log.isInfoEnabled()) {
_log.info("Registered message listener to " + destinationName);
}
}
@Override
public void messageListenerUnregistered(
String destinationName, MessageListener messageListener) {
if (_log.isInfoEnabled()) {
_log.info("Unregistered message listener from " + destinationName);
}
}
private static final Log _log = LogFactoryUtil.getLog(
S3Z9CharlieDestinationEventListener.class);
}
@Component
アノテーションの property = "destination.name=acme/s3z9_baker"
およびservice = MessageBusEventListener.class
属性は、S3Z9CharlieDestinationEventListener
をacme/s3z9_baker
宛先のDestinationEventListener
として登録するようにランタイムフレームワークにシグナルを送信します。 実装は、DestinationEventListener
の次の2つのメソッドをオーバーライドします。
messageListenerRegistered(String destinationName, MessageListener messageListener)
は、宛先に登録された新しいメッセージリスナーに応答します。messageListenerUnregistered(String destinationName, MessageListener messageListener)
は、宛先から登録解除された新しいメッセージリスナーに応答します。
S3Z9CharlieDestinationEventListener
のメソッド実装は、メッセージリスナー登録イベントをログに記録します。
メッセージバスリスナーの登録解除と宛先の削除に応答するMessageBusEventListener
とDestinationEventListener
のサンプルを確認してください。
他のイベントをトリガーする
モジュールを停止することにより、サンプルのメッセージリスナーの登録を解除し、サンプルの宛先を削除できます。 s3z9-dog-impl
がメッセージリスナーをデプロイし、s3z9-able-impl
が宛先をデプロイしたことを思い出してください。 これらのモジュールを停止すると、それらのクラスはそれぞれメッセージリスナーと宛先の登録を解除します。
ブラウザで
http://localhost:8080
にあるLiferayインスタンスにアクセスし、認証情報を使用してサインインします。Gogoシェルを開きます。
Gogoシェルコマンドフィールドに次のコマンドを入力して、サンプルモジュールを一覧表示します。
lb | grep S3Z9
各行の先頭には、対応するモジュールのID番号が含まれています。
1839|Active | 10|Acme S3Z9 Able Implementation (1.0.0)|1.0.0 1840|Active | 10|Acme S3Z9 Baker Implementation (1.0.0)|1.0.0 1841|Active | 10|Acme S3Z9 Charlie Implementation (1.0.0)|1.0.0 1842|Active | 10|Acme S3Z9 Dog Implementation (1.0.0)|1.0.0
次のGogoシェルコマンドを入力し、番号をモジュールのIDに置き換えて、メッセージリスナーのモジュールを停止します。
stop 1842
メッセージリスナーの登録解除に対する宛先イベントリスナーのログに記録された応答を確認します。
[S3Z9CharlieDestinationEventListener:33] Unregistered message listener from acme/s3z9_baker
次のGogoシェルコマンドを入力し、番号をモジュールのIDに置き換えて、宛先のモジュールを停止します。
stop 1840
すべてのメッセージバスイベントリスナーのイベントと宛先イベントリスナーのイベントをトリガーしました。
次のステップ
これらのメッセージバスイベントをリッスンする方法がわかったので、新しい宛先でメッセージをリッスンしたり、新しい登録関連のアクティビティに応じてメッセージング環境を調整したりできます。