クラス AbstractPollingMessageListenerContainer

実装されたすべてのインターフェース:
AwareBeanNameAwareDisposableBeanInitializingBeanLifecyclePhasedSmartLifecycleMessageListenerContainer
既知の直属サブクラス
DefaultMessageListenerContainer

public abstract class AbstractPollingMessageListenerContainer extends AbstractMessageListenerContainer
ポーリングに基づくリスナーコンテナー実装の基本クラス。MessageConsumerEE に基づくリスナー処理のサポートを提供し、オプションで外部管理トランザクションに参加します。

このリスナーコンテナーバリアントは、それぞれ receiveAndExecute(java.lang.Object, jakarta.jms.Session, jakarta.jms.MessageConsumer) メソッドを呼び出す、繰り返しのポーリング試行用に構築されています。使用される MessageConsumer は、到達試行のために再取得されるか、試行の間にキャッシュされます。これは具体的な実装次第です。各試行の受信タイムアウトは、"receiveTimeout" プロパティを使用して構成できます。

基礎となるメカニズムは、標準の JMS MessageConsumer 処理に基づいています。これは、Jakarta EE 環境のネイティブ JMS および JMS の両方と完全に互換性があります。JMS MessageConsumer.setMessageListener 機能も JMS ServerSessionPool 機能も必要ありません。このアプローチのもう 1 つの利点は、リスニングプロセスを完全に制御できることです。これにより、カスタムスケーリングとスロットル、同時メッセージ処理(具象サブクラスまで)が可能になります。

メッセージの受信とリスナーの実行は、Spring PlatformTransactionManager"transactionManager" プロパティに渡すことにより、トランザクションに自動的にラップできます。これは通常、Jakarta EE 環境の JtaTransactionManager と、JNDI から取得した JTA 対応の JMS ConnectionFactory との組み合わせになります(アプリケーションサーバーのドキュメントを確認してください)。

この基本クラスは、ポーリング呼び出しの非同期実行のための特定のメカニズムを想定していません。DefaultMessageListenerContainer をチェックして、Spring の TaskExecutor 抽象化に基づく具体的な実装について確認してください。これには、同時コンシューマーの動的スケーリングや自動自己回復などが含まれます。

導入:
2.0.3
作成者:
Juergen Hoeller
関連事項:
  • フィールドの詳細

    • DEFAULT_RECEIVE_TIMEOUT

      public static final long DEFAULT_RECEIVE_TIMEOUT
      デフォルトの受信タイムアウト: 1000 ms = 1 秒。
      関連事項:
  • コンストラクターの詳細

    • AbstractPollingMessageListenerContainer

      public AbstractPollingMessageListenerContainer()
  • メソッドの詳細

    • setSessionTransacted

      public void setSessionTransacted(boolean sessionTransacted)
      クラスからコピーされた説明: JmsAccessor
      JMS SessionEE の作成時に使用されるトランザクションモードを設定します。デフォルトは "false" です。

      JTA トランザクション内では、create(Queue/Topic)Session(boolean transacted, int acknowledgeMode) メソッドに渡されたパラメーターは考慮されないことに注意してください。Jakarta EE トランザクションコンテキストに応じて、コンテナーはこれらの値に対して独自の決定を行います。同様に、これらのパラメーターは、ローカルで管理されるトランザクション内でも考慮されません。これは、この場合、アクセサーが既存の JMS セッションを操作するためです。

      このフラグを "true" に設定すると、管理対象トランザクションの外部で実行する場合は短いローカル JMS トランザクションが使用され、管理対象トランザクション(XA トランザクション以外)が存在する場合は同期されたローカル JMS トランザクションが使用されます。これには、ローカル JMS トランザクションがメイントランザクション(ネイティブ JDBC トランザクションの場合もあります)と一緒に管理され、JMS トランザクションがメイントランザクションの直後にコミットされるという効果があります。

      オーバーライド:
      クラス JmsAccessorsetSessionTransacted 
      関連事項:
    • setTransactionManager

      public void setTransactionManager(@Nullable PlatformTransactionManager transactionManager)
      メッセージ受信とリスナー実行のトランザクション折り返しに使用する Spring PlatformTransactionManager を指定します。

      デフォルトは none で、トランザクション折り返しは実行されません。指定されている場合、これは通常、Spring JtaTransactionManager またはそのサブクラスの 1 つであり、このメッセージリスナーコンテナーが接続を取得する JTA 対応の ConnectionFactory と組み合わせます。

      注: 代わりにローカル JMS トランザクションの使用を検討してくださいSessionAwareMessageListener によって実行されるセッション操作(レスポンスメッセージの送信など)を含め、受信処理全体でローカルにトランザクション処理された JMS セッションを使用するには、"sessionTransacted" フラグを "true" に切り替えるだけです。これにより、JmsTransactionManager と同様に、ローカル JMS トランザクションに基づいて完全に同期された Spring トランザクションが可能になります。トランザクションの選択とメッセージの再配信シナリオについては、AbstractMessageListenerContainer の javadoc を確認してください。

      関連事項:
    • getTransactionManager

      @Nullable protected final PlatformTransactionManager getTransactionManager()
      メッセージ受信とリスナー実行のトランザクションラップに使用する Spring PlatformTransactionManager を返します。
    • setTransactionName

      public void setTransactionName(StringSE transactionName)
      トランザクション折り返しに使用するトランザクション名を指定します。デフォルトは、このリスナーコンテナーの Bean 名です(ある場合)。
      関連事項:
    • setTransactionTimeout

      public void setTransactionTimeout(int transactionTimeout)
      トランザクションラップに使用するトランザクションタイムアウトを秒単位で指定します。デフォルトは none で、トランザクションマネージャーのデフォルトタイムアウトを使用します。
      関連事項:
    • setReceiveTimeout

      public void setReceiveTimeout(long receiveTimeout)
      受信呼び出しに使用するタイムアウトをミリ秒単位で設定します。デフォルトは 1000 ミリ秒、つまり 1 秒です。

      注意 : この値は、トランザクションマネージャーが使用するトランザクションタイムアウトよりも小さくする必要があります(もちろん、適切な単位で)。0 はタイムアウトがないことを示します。ただし、これはトランザクションマネージャー内で実行されていない場合にのみ実行可能であり、そのようなリスナーコンテナーは正常にシャットダウンできないため、通常は推奨されません。-1 などの負の値は、待機なしの受信操作を示します。

      関連事項:
    • getReceiveTimeout

      protected long getReceiveTimeout()
      このリスナーコンテナーに構成されている受信タイムアウト(ミリ秒)を返します。
      導入:
      4.2
    • initialize

      public void initialize()
      クラスからコピーされた説明: AbstractJmsListeningContainer
      このコンテナーを初期化します。

      JMS 接続を作成し、ConnectionEE を開始し("autoStartup" がオフになっていない場合)、AbstractJmsListeningContainer.doInitialize() を呼び出します。

      オーバーライド:
      クラス AbstractJmsListeningContainerinitialize 
    • createListenerConsumer

      protected MessageConsumerEE createListenerConsumer(SessionEE session) throws JMSExceptionEE
      指定された JMS セッションの MessageConsumer を作成し、指定されたリスナーの MessageListener を登録します。
      パラメーター:
      session - 作業する JMS セッション
      戻り値:
      MessageConsumer
      例外:
      JMSExceptionEE - JMS メソッドによってスローされた場合
      関連事項:
    • receiveAndExecute

      protected boolean receiveAndExecute(ObjectSE invoker, @Nullable SessionEE session, @Nullable MessageConsumerEE consumer) throws JMSExceptionEE
      指定されたコンシューマーから受信したメッセージのリスナーを実行し、必要に応じて操作全体を外部トランザクションでラップします。
      パラメーター:
      session - 作業する JMS セッション
      consumer - MessageConsumer に取り組む
      戻り値:
      メッセージが受信されたかどうか
      例外:
      JMSExceptionEE - JMS メソッドによってスローされた場合
      関連事項:
    • doReceiveAndExecute

      protected boolean doReceiveAndExecute(ObjectSE invoker, @Nullable SessionEE session, @Nullable MessageConsumerEE consumer, @Nullable TransactionStatus status) throws JMSExceptionEE
      実際に、指定されたコンシューマーから受信したメッセージのリスナーを実行し、すべてを取得するにはリソースが必要で、リスナーを呼び出します。
      パラメーター:
      session - 作業する JMS セッション
      consumer - MessageConsumer に取り組む
      status - TransactionStatus (null の場合があります)
      戻り値:
      メッセージが受信されたかどうか
      例外:
      JMSExceptionEE - JMS メソッドによってスローされた場合
      関連事項:
    • isSessionLocallyTransacted

      protected boolean isSessionLocallyTransacted(SessionEE session)
      この実装は、セッションが外部的に同期されているかどうかを確認します。この場合、リスナーコンテナーの "sessionTransacted" フラグが "true" に設定されているにもかかわらず、セッションはローカルでトランザクション処理されません。
      オーバーライド:
      クラス AbstractMessageListenerContainerisSessionLocallyTransacted 
      パラメーター:
      session - チェックするセッション
      戻り値:
      指定されたセッションがローカルでトランザクションされるかどうか
      関連事項:
    • shouldCommitAfterNoMessageReceived

      protected boolean shouldCommitAfterNoMessageReceived(SessionEE session)
      メッセージが受信されなかった後にコミットをトリガーするかどうかを決定します。これは、現代の JMS プロバイダーでは良い考えです。
      パラメーター:
      session - メッセージを受信しなかった現在の JMS セッション
      戻り値:
      指定されたセッションで AbstractMessageListenerContainer.commitIfNecessary(jakarta.jms.Session, jakarta.jms.Message) を呼び出すかどうか
    • receiveMessage

      @Nullable protected MessageEE receiveMessage(MessageConsumerEE consumer) throws JMSExceptionEE
      指定されたコンシューマーからメッセージを受信します。
      パラメーター:
      consumer - 使用する MessageConsumer
      戻り値:
      メッセージ、ない場合は null 
      例外:
      JMSExceptionEE - JMS メソッドによってスローされた場合
    • messageReceived

      protected void messageReceived(ObjectSE invoker, SessionEE session)
      新しいメッセージが受信されたときに、処理を試みる前に呼び出されるテンプレートメソッド。サブクラスが実際の受信メッセージのイベントに反応できるようにします。たとえば、コンシューマー数を調整します。
      パラメーター:
      invoker - 呼び出し元オブジェクト (通りました)
      session - 受信 JMS セッション
    • noMessageReceived

      protected void noMessageReceived(ObjectSE invoker, SessionEE session)
      メッセージが受信されなかった場合に、受信ループに再び戻る前に呼び出されるテンプレートメソッド。サブクラスが受信メッセージのないイベントに反応できるようにします。たとえば、呼び出し元をアイドルとしてマークします。
      パラメーター:
      invoker - 呼び出し元オブジェクト (通りました)
      session - 受信 JMS セッション
    • getConnection

      @Nullable protected ConnectionEE getConnection(JmsResourceHolder holder)
      指定された JmsResourceHolder から適切な接続をフェッチします。

      この実装は、すべての JMS 1.1 接続を受け入れます。

      パラメーター:
      holder - JmsResourceHolder
      戻り値:
      ホルダーからフェッチされた適切な接続、または見つからない場合は null 
    • getSession

      @Nullable protected SessionEE getSession(JmsResourceHolder holder)
      指定された JmsResourceHolder から適切なセッションをフェッチします。

      この実装は、すべての JMS 1.1 セッションを受け入れます。

      パラメーター:
      holder - JmsResourceHolder
      戻り値:
      ホルダーからフェッチされた適切なセッション、または見つからない場合は null