Documentation

登録イベントを聞く

メッセージングAPIは、宛先登録イベントおよびメッセージリスナー登録イベントのリッスンをサポートします。 これらのイベントをリッスンする理由は次のとおりです。

  • 興味のあるメッセージを新しい宛先に送信する場合

  • 宛先でのメッセージングに調整が必要な場合

  • 未登録の宛先に依存する場合

  • 登録を解除して再割り当て可能なリソースを解放する場合

サンプルプロジェクトは、これらの登録イベントをリッスンする方法を示しています。 サンプルを実行することから始めます。 次に、イベントリスナーの実装を調べます。 最後に、登録解除イベントをトリガーします。

サンプルでイベントをトリガーする

これらは、宛先の登録リスナー、メッセージリスナーの登録リスナー、そしてそれらがリッスンするイベントをトリガーするクラスをデプロイします。

新しいLiferayインスタンスを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22

http://localhost:8080でLiferayにサインインします。メールアドレスtest@liferay.comとパスワードtestを使用してください。プロンプトが表示されたら、パスワードをlearnに変更します。

次に、以下の手順を実行します。

  1. サンプルをダウンロードして解凍します。

    curl https://learn.liferay.com/dxp/latest/ja/building-applications/core-frameworks/message-bus/liferay-s3z9.zip -O
    
    unzip liferay-s3z9.zip
    
  2. s3z9-able-implモジュールをデプロイして、メッセージバスイベントリスナーを起動します。

    cd liferay-s3z9/s3z9-able-impl
    
    ../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    注釈

    このコマンドは、モジュールJARをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。

  3. s3z9-baker-implモジュールをデプロイして、宛先を追加します。

    cd ../s3z9-baker-impl
    
    ../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  4. Dockerコンテナのコンソールには、新しく追加された宛先に対するS3Z9AbleMessageBusEventListenerの応答が表示されます。

    [main][S3Z9AbleMessageBusEventListener:17] Destination added acme/s3z9_baker
    
  5. s3z9-charlie-implモジュールをデプロイして、宛先イベントリスナーを起動します。

    cd ../s3z9-charlie-impl
    
    ../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  6. s3z9-dog-implモジュールをデプロイして、メッセージリスナーを宛先に登録します。

    cd ../s3z9-dog-impl
    
    ../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  7. Dockerコンテナのコンソールには、新しく登録されたメッセージリスナーに対するS3Z9CharlieDestinationEventListenerの応答が表示されます。

    [S3Z9CharlieDestinationEventListener:23] Registered message listener to acme/s3z9_baker
    

モジュールの概要は次のとおりです。

  1. s3z9-able-implMessageBusEventListener 実装は、宛先の追加と削除をリッスンします。

  2. s3z9-baker-implのメッセージングコンフィギュレータクラスは宛先を追加します。s3z9-able-implMessageBusEventListener実装は、追加された宛先通知を受信し、イベントをログに記録します。

  3. s3z9-charlie-implDestinationEventListener 実装は、宛先に登録するメッセージリスナー、または宛先から登録解除するメッセージリスナーをリッスンします。

  4. s3z9-dog-implMessageListener 実装は宛先に登録されます。 s3z9-charlie-implDestinationEventListener実装は、メッセージリスナー登録通知を受信し、イベントをログに記録します。

MessageBusEventListenerを調べる

Destination が追加または削除されると、メッセージバスは 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 属性は、S3Z9AbleMessageBusEventListenerMessageBusEventListenerとして登録するようにランタイムフレームワークにシグナルを送信します。 実装は、MessageBusEventListenerの次の2つのメソッドをオーバーライドします。

  • destinationAdded(Destination destination)は、新しく追加されたDestinationに応答します。

  • destinationRemoved(Destination destination)は、新しく削除されたDestinationに応答します。

S3Z9AbleMessageBusEventListenerのメソッド実装は、宛先イベントをログに記録します。

DestinationEventListenerを調べる

メッセージバスは、 MessageListenerDestinationEventListenerの指定された宛先に対し登録または登録解除を行うと、 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属性は、S3Z9CharlieDestinationEventListeneracme/s3z9_baker宛先のDestinationEventListenerとして登録するようにランタイムフレームワークにシグナルを送信します。 実装は、DestinationEventListenerの次の2つのメソッドをオーバーライドします。

  • messageListenerRegistered(String destinationName, MessageListener messageListener)は、宛先に登録された新しいメッセージリスナーに応答します。

  • messageListenerUnregistered(String destinationName, MessageListener messageListener)は、宛先から登録解除された新しいメッセージリスナーに応答します。

S3Z9CharlieDestinationEventListenerのメソッド実装は、メッセージリスナー登録イベントをログに記録します。

メッセージバスリスナーの登録解除と宛先の削除に応答するMessageBusEventListenerDestinationEventListenerのサンプルを確認してください。

他のイベントをトリガーする

モジュールを停止することにより、サンプルのメッセージリスナーの登録を解除し、サンプルの宛先を削除できます。 s3z9-dog-implがメッセージリスナーをデプロイし、s3z9-able-implが宛先をデプロイしたことを思い出してください。 これらのモジュールを停止すると、それらのクラスはそれぞれメッセージリスナーと宛先の登録を解除します。

  1. ブラウザでhttp://localhost:8080にあるLiferayインスタンスにアクセスし、認証情報を使用してサインインします。

  2. Gogoシェルを開きます。

  3. 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
    
  4. 次のGogoシェルコマンドを入力し、番号をモジュールのIDに置き換えて、メッセージリスナーのモジュールを停止します。

    stop 1842
    
  5. メッセージリスナーの登録解除に対する宛先イベントリスナーのログに記録された応答を確認します。

    [S3Z9CharlieDestinationEventListener:33] Unregistered message listener from acme/s3z9_baker
    
  6. 次のGogoシェルコマンドを入力し、番号をモジュールのIDに置き換えて、宛先のモジュールを停止します。

    stop 1840
    

すべてのメッセージバスイベントリスナーのイベントと宛先イベントリスナーのイベントをトリガーしました。

次のステップ

これらのメッセージバスイベントをリッスンする方法がわかったので、新しい宛先でメッセージをリッスンしたり、新しい登録関連のアクティビティに応じてメッセージング環境を調整したりできます。