クラス DefaultMessageListenerContainer
- 実装されたすべてのインターフェース:
Aware
、BeanNameAware
、DisposableBean
、InitializingBean
、Lifecycle
、Phased
、SmartLifecycle
、MessageListenerContainer
MessageConsumer.receive()
呼び出しのループ。ネイティブ JMS 環境および Jakarta EE 環境で機能するように設計されており、構成の違いは最小限です。 これはシンプルですが、それでも強力な形式のメッセージリスナーコンテナーです。起動時に、リスナーを呼び出すための JMS セッションの固定数を取得し、オプションで実行時の動的適応を可能にします(最大数まで)。SimpleMessageListenerContainer
と同様に、その主な利点はランタイムの複雑度が低いこと、特に JMS プロバイダーの最小要件です。JMS ServerSessionPool
機能さえ必要ありません。さらに、ブローカーが一時的に使用不可になった場合に完全に自己回復し、停止 / 再起動だけでなく、構成のランタイム変更も可能です。
実際の MessageListener
実行は、Spring の TaskExecutor
抽象化によって作成された非同期作業単位で発生します。デフォルトでは、"concurrentConsumers"
設定に従って、指定された数のインボーカータスクが起動時に作成されます。代わりの TaskExecutor
を指定して、既存のスレッドプール機能 (Jakarta EE サーバーなど) と統合します。ネイティブ JMS セットアップでは、これらの各リスナースレッドはキャッシュされた JMS Session
および MessageConsumer
(失敗した場合にのみリフレッシュされる) を使用し、JMS プロバイダーのリソースを可能な限り効率的に使用します。
Spring PlatformTransactionManager
を "transactionManager"
プロパティに渡すことにより、メッセージの受信とリスナーの実行をトランザクションに自動的にラップできます。これは通常、Jakarta EE 環境の JtaTransactionManager
と、JNDI から取得した JTA 対応の JMS ConnectionFactory
との組み合わせになります(Jakarta EE サーバーのドキュメントを確認してください)。すべての Jakarta EE サーバー(特に JBoss)との互換性のために外部トランザクションマネージャーが指定されている場合、このリスナーコンテナーは各トランザクションのすべての JMS ハンドルを自動的に再取得することに注意してください。この非キャッシュ動作は、"cacheLevel"
/"cacheLevelName"
プロパティによってオーバーライドでき、外部トランザクションマネージャーが関係している場合でも、Connection
(または Session
および MessageConsumer
)のキャッシュを強制します。
同時呼び出し側の数の動的なスケーリングは、"concurrentConsumers"
値よりも高い "maxConcurrentConsumers"
値を指定することでアクティブ化できます。後者のデフォルトは 1 なので、"maxConcurrentConsumers" をたとえば 5 に指定するだけで、メッセージ負荷が増加する場合に同時呼び出し側の数が 5 まで動的にスケーリングされ、負荷が減少すると標準の呼び出し側の数まで動的に縮小されます。特に ConnectionFactory
が JMS Sessions
をプールしていない場合や TaskExecutor
がスレッドをプールしていない場合 (構成を確認してください)、頻繁なスケーリングアップとスケールダウンを回避するために、各新規タスクのライフスパンを制御するために "idleTaskExecutionLimit"
設定を調整することを検討してください。そもそも、動的なスケーリングはキューに対してのみ意味があることに注意してください。トピックの場合、通常はデフォルトの呼び出し側の数である 1 を使用します。そうしないと、同じノードで同じメッセージを複数回受信することになります。
注: CachingConnectionFactory
をリスナーコンテナーで使用できますが、制限があります。一般に、リスナーコンテナー自体がそのライフサイクル内で適切なキャッシュを処理できるようにすることが推奨されます。また、リスナーコンテナーの停止と再起動は、ローカルにキャッシュされた独立した Connection
でのみ機能し、外部にキャッシュされたものでは機能しません。最後に重要なことですが、CachingConnectionFactory
では、"maxMessagesPerTask"
などのカスタムプロバイダーヒントを使用した動的スケーリングにより、JMS メッセージがリスナーコンテナーにアタッチされなくなった場合でも、キャッシュされたコンシューマーに配信される可能性があります。
"sessionTransacted"
を "true" に設定するか、外部 "transactionManager"
を指定することを強くお勧めします。承認モードとネイティブトランザクションオプションの詳細については AbstractMessageListenerContainer
javadoc を参照してください。外部トランザクションマネージャーの設定の詳細については AbstractPollingMessageListenerContainer
javadoc を参照してください。デフォルトの "AUTO_ACKNOWLEDGE" モードでは、このコンテナーはリスナー実行前に自動メッセージ確認を適用し、例外の場合に再配信しないことに注意してください。
ネストされたクラスのサマリー
クラス org.springframework.jms.listener.AbstractJmsListeningContainer から継承されたネストクラス / インターフェース
AbstractJmsListeningContainer.SharedConnectionNotInitializedException
フィールドサマリー
修飾子と型フィールド説明static final int
適切なキャッシュレベルの自動選択を示す定数(トランザクション管理戦略に依存)。static final int
各リスナースレッドの共有 JMSConnection
をキャッシュすることを示す定数。static final int
リスナースレッドごとに共有 JMSConnection
、JMSSession
、JMS MessageConsumer をキャッシュすることを示す定数。static final int
JMS リソースをまったくキャッシュしないことを示す定数。static final int
各リスナースレッドの共有 JMSConnection
および JMSSession
をキャッシュすることを示す定数。static final long
デフォルトの回復間隔: 5000 ミリ秒 = 5 秒。static final StringSE
デフォルトのスレッド名プレフィックス: "DefaultMessageListenerContainer-"。クラス org.springframework.jms.listener.AbstractPollingMessageListenerContainer から継承されたフィールド
DEFAULT_RECEIVE_TIMEOUT
クラス org.springframework.jms.listener.AbstractJmsListeningContainer から継承されたフィールド
lifecycleMonitor, sharedConnectionMonitor
クラス org.springframework.jms.support.destination.JmsDestinationAccessor から継承されたフィールド
RECEIVE_TIMEOUT_INDEFINITE_WAIT, RECEIVE_TIMEOUT_NO_WAIT
クラス org.springframework.jms.support.JmsAccessor から継承されたフィールド
logger
インターフェース org.springframework.context.SmartLifecycle から継承されたフィールド
DEFAULT_PHASE
コンストラクターのサマリー
メソッドのサマリー
修飾子と型メソッド説明protected boolean
applyBackOffTime
(BackOffExecution execution) 指定されたBackOffExecution
を使用して、次のバックオフ時間を適用します。protected TaskExecutor
デフォルトの TaskExecutor を作成します。protected void
JMS セッションと関連する MessageConsumer の形式で、個別のスレッドで実行されている指定数の同時コンシューマーを作成します。protected void
doRescheduleTask
(ObjectSE task) このリスナーコンテナーの TaskExecutor を介して、指定されたタスクを再実行します。protected void
登録済みの JMS セッションと関連する MessageConsumers を破棄します。protected void
初期設定での失敗を受け入れるためにオーバーライドされます。最初のアクセスで共有接続を確立するのは非同期呼び出し側に任されます。final int
現在アクティブなコンシューマーの数を返します。int
このリスナーコンテナーが適用を許可されているキャッシュのレベルを返します。final int
"concurrentConsumer" 設定を戻します。final int
アイドル状態のコンシューマーの数の制限を返します。int
コンシューマーを「アイドル」としてマークする前に、1 つのタスクで受信する後続の null メッセージの最大数を返します。final int
コンシューマータスクのアイドル実行の制限を返します。final int
"maxConcurrentConsumer" 設定を戻します。final int
1 つのタスクで処理するメッセージの最大数を返します。final int
現在スケジュールされているコンシューマーの数を返します。protected void
handleListenerSetupFailure
(ThrowableSE ex, boolean alreadyRecovered) リスナーのセットアップ中に発生した特定の例外を処理します。void
このコンテナーを初期化します。final boolean
このリスナーコンテナーが現在リカバリを試みているかどうかを返します。boolean
少なくとも 1 人のコンシューマーが対象の宛先に固定登録を入力したかどうかを返します。protected void
messageReceived
(ObjectSE invoker, SessionEE session) メッセージが入ってくることがわかっているため、新しい呼び出し側のスケジューリングを試みます...protected void
noMessageReceived
(ObjectSE invoker, SessionEE session) 影響を受ける呼び出し元をアイドルとしてマークします。protected void
リスナーがそれ自体のセットアップに失敗した後、基礎となる接続の再確立など、このリスナーコンテナーを回復します。protected void
試行が成功する前に戻らないで、基礎となる接続をリフレッシュします。protected void
このリスナーコンテナーが動作する JMS 宛先をリフレッシュします。protected void
新しい呼び出し元をスケジュールし、このリスナーコンテナーのスケジュールされた呼び出し元の合計数を増やします。ただし、指定された "maxConcurrentConsumers" 制限にまだ達しておらず、指定された "idleConsumerLimit" にも達していない場合に限ります。void
setBackOff
(BackOff backOff) 回復試行の間隔を計算するために使用するBackOff
インスタンスを指定します。void
setCacheLevel
(int cacheLevel) このリスナーコンテナーが適用できるキャッシュのレベルを指定します。void
setCacheLevelName
(StringSE constantName) このリスナーコンテナーが適用できるキャッシュのレベルを、対応する定数の名前の形式で指定します。たとえば、"CACHE_CONNECTION"
。void
setConcurrency
(StringSE concurrency) "lower-upper" 文字列を介して同時実行制限を指定します。void
setConcurrentConsumers
(int concurrentConsumers) 作成する同時コンシューマーの数を指定します。void
setIdleConsumerLimit
(int idleConsumerLimit) 常にアイドル状態を許可するコンシューマーの数の制限を指定します。void
setIdleReceivesPerTaskLimit
(int idleReceivesPerTaskLimit) 指定されたアイドル受信数に達した後、コンシューマーを「アイドル」としてマークします。void
setIdleTaskExecutionLimit
(int idleTaskExecutionLimit) 実行中にメッセージを受信していない、コンシューマータスクのアイドル実行の制限を指定します。void
setMaxConcurrentConsumers
(int maxConcurrentConsumers) 作成する同時コンシューマーの最大数を指定します。void
setMaxMessagesPerTask
(int maxMessagesPerTask) 1 つのタスクで処理するメッセージの最大数を指定します。void
setRecoveryInterval
(long recoveryInterval) 回復試行の間隔をミリ秒単位で指定します。void
setTaskExecutor
(ExecutorSE taskExecutor) リスナースレッドの実行に使用する SpringTaskExecutor
を設定します。protected final boolean
"cacheLevel" 設定に応じて共有 JMS 接続を使用します。void
start()
停止コールバックがあれば、それをリセットするためにオーバーライドされます。protected void
この実装は、Connection.start()
から例外がスローされた後でも続行され、適切な回復を実行するためにリスナーに依存します。void
stop
(RunnableSE callback) このリスナーコンテナーを停止し、すべてのリスナー処理が実際に停止したら、特定のコールバックを呼び出します。protected void
この実装は、Connection.stop()
から例外がスローされた後でも続行され、再起動後に適切なリカバリを実行するためにリスナーに依存します。クラス org.springframework.jms.listener.AbstractPollingMessageListenerContainer から継承されたメソッド
createListenerConsumer, doReceiveAndExecute, getConnection, getReceiveTimeout, getSession, getTransactionManager, isSessionLocallyTransacted, receiveAndExecute, receiveMessage, setReceiveTimeout, setSessionTransacted, setTransactionManager, setTransactionName, setTransactionTimeout, shouldCommitAfterNoMessageReceived
クラス org.springframework.jms.listener.AbstractMessageListenerContainer から継承されたメソッド
checkMessageListener, commitIfNecessary, createConsumer, createObservation, doExecuteListener, doInvokeListener, doInvokeListener, executeListener, getDefaultSubscriptionName, getDestination, getDestinationDescription, getDestinationName, getDurableSubscriptionName, getErrorHandler, getExceptionListener, getMessageConverter, getMessageListener, getMessageSelector, getObservationRegistry, getReplyQosSettings, getSubscriptionName, handleListenerException, invokeErrorHandler, invokeExceptionListener, invokeListener, isAcceptMessagesWhileStopping, isExposeListenerSession, isPubSubNoLocal, isReplyPubSubDomain, isSubscriptionDurable, isSubscriptionShared, rollbackIfNecessary, rollbackOnExceptionIfNecessary, setAcceptMessagesWhileStopping, setDestination, setDestinationName, setDurableSubscriptionName, setErrorHandler, setExceptionListener, setExposeListenerSession, setMessageConverter, setMessageListener, setMessageSelector, setObservationRegistry, setPubSubNoLocal, setReplyPubSubDomain, setReplyQosSettings, setSubscriptionDurable, setSubscriptionName, setSubscriptionShared, setupMessageListener, validateConfiguration
クラス org.springframework.jms.listener.AbstractJmsListeningContainer から継承されたメソッド
afterPropertiesSet, createSharedConnection, destroy, doStart, doStop, getBeanName, getClientId, getPausedTaskCount, getPhase, getSharedConnection, isActive, isAutoStartup, isRunning, logRejectedTask, prepareSharedConnection, refreshSharedConnection, releaseSharedConnection, rescheduleTaskIfNecessary, resumePausedTasks, runningAllowed, setAutoStartup, setBeanName, setClientId, setPhase, shutdown, stop
クラス org.springframework.jms.support.destination.JmsDestinationAccessor から継承されたメソッド
getDestinationResolver, isPubSubDomain, receiveFromConsumer, resolveDestinationName, setDestinationResolver, setPubSubDomain
クラス org.springframework.jms.support.JmsAccessor から継承されたメソッド
convertJmsAccessException, createConnection, createSession, getConnectionFactory, getSessionAcknowledgeMode, isClientAcknowledge, isSessionTransacted, obtainConnectionFactory, setConnectionFactory, setSessionAcknowledgeMode, setSessionAcknowledgeModeName
クラス java.lang.ObjectSE から継承されたメソッド
clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSE
インターフェース org.springframework.jms.listener.MessageListenerContainer から継承されたメソッド
getDestinationResolver, isPubSubDomain
インターフェース org.springframework.context.SmartLifecycle から継承されたメソッド
getPhase, isAutoStartup
フィールドの詳細
DEFAULT_THREAD_NAME_PREFIX
デフォルトのスレッド名プレフィックス: "DefaultMessageListenerContainer-"。DEFAULT_RECOVERY_INTERVAL
public static final long DEFAULT_RECOVERY_INTERVALデフォルトの回復間隔: 5000 ミリ秒 = 5 秒。- 関連事項:
CACHE_NONE
public static final int CACHE_NONEJMS リソースをまったくキャッシュしないことを示す定数。CACHE_CONNECTION
public static final int CACHE_CONNECTION各リスナースレッドの共有 JMSConnection
をキャッシュすることを示す定数。CACHE_SESSION
public static final int CACHE_SESSION各リスナースレッドの共有 JMSConnection
および JMSSession
をキャッシュすることを示す定数。CACHE_CONSUMER
public static final int CACHE_CONSUMERリスナースレッドごとに共有 JMSConnection
、JMSSession
、JMS MessageConsumer をキャッシュすることを示す定数。CACHE_AUTO
public static final int CACHE_AUTO適切なキャッシュレベルの自動選択を示す定数(トランザクション管理戦略に依存)。
コンストラクターの詳細
DefaultMessageListenerContainer
public DefaultMessageListenerContainer()
メソッドの詳細
setTaskExecutor
リスナースレッドの実行に使用する SpringTaskExecutor
を設定します。デフォルトは
SimpleAsyncTaskExecutor
で、指定された同時コンシューマーの数に応じて、いくつかの新しいスレッドを起動します。既存のスレッドプールと統合するための代替
TaskExecutor
を指定します。これは、スレッドが特定の方法(Jakarta EE 環境内など)で管理されている場合にのみ、実際に価値をもたらすことに注意してください。このリスナコンテナーはその存続期間全体でいくつかのスレッドを占有するため、プレーンスレッドプールはあまり価値がありません。setBackOff
リカバリ試行の間隔を計算するために使用するBackOff
インスタンスを指定します。BackOffExecution
実装がBackOffExecution.STOP
を返す場合、このリスナーコンテナーはそれ以上の回復を試みません。このプロパティが設定されている場合、
recovery interval
は無視されます。- 導入:
- 4.1
setRecoveryInterval
public void setRecoveryInterval(long recoveryInterval) 回復試行の間隔をミリ秒単位で指定します。デフォルトは 5000 ミリ秒、つまり 5 秒です。これは、指定された間隔でFixedBackOff
を作成する便利なメソッドです。その他の回復オプションについては、代わりに
BackOff
インスタンスを指定することを検討してください。setCacheLevelName
このリスナーコンテナーが適用できるキャッシュのレベルを、対応する定数の名前の形式で指定します。たとえば、"CACHE_CONNECTION"
。setCacheLevel
public void setCacheLevel(int cacheLevel) このリスナーコンテナーが適用できるキャッシュのレベルを指定します。外部トランザクションマネージャーが指定されている場合(外部トランザクションのスコープ内ですべてのリソースを新しく取得するため)、デフォルトは
CACHE_NONE
です。それ以外の場合(ローカル JMS リソースで動作する)CACHE_CONSUMER
です。一部の Jakarta EE サーバーは、新しく取得された JMS
Connection
およびSession
の場合、進行中の XA トランザクションにのみ JMS リソースを登録します。そのため、このリスナーコンテナーはデフォルトでこれらのいずれもキャッシュしません。ただし、トランザクションリソースのキャッシュに関するサーバーのルールによっては、この設定を外部トランザクションマネージャーと組み合わせても、少なくともCACHE_CONNECTION
またはCACHE_SESSION
に切り替えることを検討してください。getCacheLevel
public int getCacheLevel()このリスナーコンテナーが適用を許可されているキャッシュのレベルを返します。setConcurrency
"lower-upper" 文字列を使用して同時実行制限を指定します。"5-10"、または単純な上限文字列。"10" (この場合、下限は 1 になります)。このリスナーコンテナーは常に最小数のコンシューマー(
setConcurrentConsumers(int)
)を保持し、負荷が増加した場合に最大数のコンシューマーsetMaxConcurrentConsumers(int)
に徐々に拡大します。- 次で指定:
- クラス
AbstractMessageListenerContainer
のsetConcurrency
setConcurrentConsumers
public void setConcurrentConsumers(int concurrentConsumers) 作成する同時コンシューマーの数を指定します。デフォルトは 1 です。この設定に高い値を指定すると、実行時にスケジュールされる同時コンシューマーの標準レベルが増加します。これは、実質的に、任意の時点でスケジュールされる同時コンシューマーの最小数です。これは静的な設定です。動的スケーリングの場合は、代わりに "maxConcurrentConsumers" 設定を指定することを検討してください。
同時コンシューマーの数を増やすことは、キューから入ってくるメッセージの消費を拡大するために推奨されます。ただし、複数のコンシューマーが登録されると、順序付けの保証は失われます。一般に、少量のキューの場合は 1 つのコンシューマーに固執します。
ベンダー固有のセットアップ手段で明確に許可されていない限り、トピックの同時コンシューマーの数を上げないでください。通常のセットアップでは、これにより同じメッセージが同時に消費されることになり、これはほとんど望ましくありません。
この設定は、JMX などを介して実行時に変更できます。
getConcurrentConsumers
public final int getConcurrentConsumers()"concurrentConsumer" 設定を戻します。これは、現在構成されている "concurrentConsumers" 値を返します。現在スケジュールされている / アクティブなコンシューマーの数は異なる場合があります。
setMaxConcurrentConsumers
public void setMaxConcurrentConsumers(int maxConcurrentConsumers) 作成する同時コンシューマーの最大数を指定します。デフォルトは 1 です。この設定が "concurrentConsumers" より大きい場合、十分な数の受信メッセージが検出されると、リスナーコンテナーは実行時に新しいコンシューマーを動的にスケジュールします。負荷が再び低下すると、コンシューマーの数は再び標準レベル ( "concurrentConsumers" ) に削減されます。
同時コンシューマーの数を増やすことは、キューから入ってくるメッセージの消費を拡大するために推奨されます。ただし、複数のコンシューマーが登録されると、順序付けの保証は失われます。一般に、少量のキューの場合は 1 つのコンシューマーに固執します。
ベンダー固有のセットアップ手段で明確に許可されていない限り、トピックの同時コンシューマーの数を上げないでください。通常のセットアップでは、これにより同じメッセージが同時に消費されることになり、これはほとんど望ましくありません。
この設定は、JMX などを介して実行時に変更できます。
getMaxConcurrentConsumers
public final int getMaxConcurrentConsumers()"maxConcurrentConsumer" 設定を戻します。これは、現在構成されている "maxConcurrentConsumers" 値を返します。現在スケジュールされている / アクティブなコンシューマーの数は異なる場合があります。
setMaxMessagesPerTask
public void setMaxMessagesPerTask(int maxMessagesPerTask) 1 つのタスクで処理するメッセージの最大数を指定します。より具体的には、これはタスクごとのメッセージ受信試行回数を制限します。これには、タイムアウトに達するまで実際にメッセージを取得しなかった受信反復が含まれます("receiveTimeout"
プロパティを参照)。標準の TaskExecutor の場合、デフォルトは無制限(-1)であり、(動的スケジューリングが制限される代わりに)シャットダウンするまで元の呼び出しスレッドを再利用します。
存続期間の短いタスクの優先順位を示す SchedulingTaskExecutor の場合、デフォルトは代わりに 10 です。ここでは、長命のタスクと短命のタスクのバランスを取るために、10 〜 100 のメッセージ数を指定します。
存続期間の長いタスクは、同じスレッドをずっと使用し続けることにより、スレッドコンテキストの頻繁な切り替えを回避します。スレッドプールは通常、短期間のタスクを優先します。
この設定は、JMX などを介して実行時に変更できます。
getMaxMessagesPerTask
public final int getMaxMessagesPerTask()1 つのタスクで処理するメッセージの最大数を返します。setIdleConsumerLimit
public void setIdleConsumerLimit(int idleConsumerLimit) 常にアイドル状態を許可するコンシューマーの数の制限を指定します。この制限は、
scheduleNewInvokerIfAppropriate()
メソッドによって使用され、新しい呼び出し元を作成する必要があるかどうかを決定します。制限を増やすと、呼び出し元がより積極的に作成されます。これは、呼び出し元の数をより早く増やすのに役立ちます。デフォルトは 1 で、既存の呼び出し元がどれも現在アイドル状態でない場合にのみ、新しい呼び出し元(最初はアイドルである可能性が高い)をスケジュールするだけです。
getIdleConsumerLimit
public final int getIdleConsumerLimit()アイドル状態のコンシューマーの数の制限を返します。setIdleTaskExecutionLimit
public void setIdleTaskExecutionLimit(int idleTaskExecutionLimit) 実行中にメッセージを受信していない、コンシューマータスクのアイドル実行の制限を指定します。この制限に達すると、タスクはシャットダウンし、受信を他の実行中のタスクに任せます。デフォルトは 1 で、タスクがメッセージを受信しなかった場合、アイドルリソースを早期に閉じます。これは動的スケジューリングにのみ適用されます。
"maxConcurrentConsumers"
設定を参照してください。最小数のコンシューマー("concurrentConsumers"
を参照)は、いずれにしてもシャットダウンするまで保持されます。各タスク実行内で、メッセージ受信試行回数 ( "maxMessagesPerTask" 設定による) はそれぞれ受信メッセージ ( "receiveTimeout" 設定による) を待機します。特定のタスクでの受信試行がすべてメッセージなしで返された場合、そのタスクは受信メッセージに関してアイドル状態であるとみなされます。このようなタスクは再スケジュールできますが、指定された "idleTaskExecutionLimit" に達するとシャットダウンされます (動的スケーリングの場合)。
スケールアップとスケールダウンが頻繁に発生する場合は、この制限を上げてください。この制限を高くすると、アイドル状態のコンシューマーが長く保持され、新しいメッセージのロードが入ってきてもコンシューマーが再起動されるのを回避できます。または、"maxMessagesPerTask" や "receiveTimeout" の値を大きくすると、アイドル状態のコンシューマーが長く保持されるようになります (スケジュールされた各タスクの平均実行時間も長くなります)。
この設定は、JMX などを介して実行時に変更できます。
getIdleTaskExecutionLimit
public final int getIdleTaskExecutionLimit()コンシューマータスクのアイドル実行の制限を返します。setIdleReceivesPerTaskLimit
public void setIdleReceivesPerTaskLimit(int idleReceivesPerTaskLimit) 指定されたアイドル受信数に達した後、コンシューマーを「アイドル」としてマークします。アイドル状態の受信は、潜在的なAbstractPollingMessageListenerContainer.setReceiveTimeout(long)
が経過した後、受信者から null メッセージが返された瞬間からカウントされます。これにより、アイドルタスク数がsetIdleTaskExecutionLimit(int)
を超えているかどうかを確認し、それに基づいてタスクを再スケジュールする必要があるかどうかを判断し、それ以外の場合に保持されるリソースを節約できます。この設定は、受信したメッセージが null または null 以外のメッセージであるかどうかに関係なく、この制限に達した後にタスクが解放されて再スケジュールされる
setMaxMessagesPerTask(int)
とは異なります。この設定だけでは、タスクごとに十分な大きさのバッチが必要であるが、処理するメッセージがなくなった瞬間からクイック(er)リリースが必要な場合、柔軟性がなくなる可能性があります。この設定は、アイドルとしてマークされた回数の反復後にこの制限がタスクを解放することを決定する
setIdleTaskExecutionLimit(int)
とは異なります。次に例を示します:
setMaxMessagesPerTask(int)
が "500" に設定され、#setIdleReceivesPerTaskLimit
が "60" に設定され、AbstractPollingMessageListenerContainer.setReceiveTimeout(long)
が "1000" に設定され、setIdleTaskExecutionLimit(int)
が "1" に設定されている場合、後続の 60 アイドル数がない限り、タスクごとに 500 メッセージが処理されます。メッセージを受信すると、タスクはアイドルとしてマークされ、解放されます。これは、最後のメッセージが処理された後、新しいメッセージが表示されない限り、60 秒後にタスクが解放されることも意味します。getIdleReceivesPerTaskLimit
public int getIdleReceivesPerTaskLimit()コンシューマーを「アイドル」としてマークする前に、1 つのタスクで受信する後続の null メッセージの最大数を返します。- 導入:
- 5.3.5
initialize
public void initialize()クラスからコピーされた説明:AbstractJmsListeningContainer
このコンテナーを初期化します。JMS 接続を作成し、
Connection
EE を開始し("autoStartup"
がオフになっていない場合)、AbstractJmsListeningContainer.doInitialize()
を呼び出します。- オーバーライド:
- クラス
AbstractPollingMessageListenerContainer
のinitialize
doInitialize
JMS セッションと関連する MessageConsumer の形式で、個別のスレッドで実行されている指定数の同時コンシューマーを作成します。- 次で指定:
- クラス
AbstractJmsListeningContainer
のdoInitialize
- 例外:
JMSExceptionEE
- 登録に失敗した場合- 関連事項:
scheduleNewInvoker()
setTaskExecutor(java.util.concurrent.Executor)
doShutdown
登録済みの JMS セッションと関連する MessageConsumers を破棄します。- 次で指定:
- クラス
AbstractJmsListeningContainer
のdoShutdown
- 例外:
JMSExceptionEE
- シャットダウンに失敗した場合- 関連事項:
start
停止コールバックがあれば、それをリセットするためにオーバーライドされます。- 次で指定:
- インターフェース
Lifecycle
のstart
- オーバーライド:
- クラス
AbstractJmsListeningContainer
のstart
- 例外:
JmsException
- 起動に失敗した場合- 関連事項:
stop
このリスナーコンテナーを停止し、すべてのリスナー処理が実際に停止したら、特定のコールバックを呼び出します。メモ: さらに
stop(runnable)
呼び出し(処理が実際に停止する前)は、指定されたコールバックをオーバーライドします。最後に指定されたコールバックのみが呼び出されます。後続の
start()
呼び出しが完全に停止する前にリスナーコンテナーを再起動した場合、コールバックはまったく呼び出されません。- パラメーター:
callback
- リスナー処理が完全に停止したときに呼び出すコールバック- 例外:
JmsException
- 停止に失敗した場合- 関連事項:
getScheduledConsumerCount
public final int getScheduledConsumerCount()現在スケジュールされているコンシューマーの数を返します。この数値は常に "concurrentConsumers" と "maxConcurrentConsumers" の間になりますが、"activeConsumerCount" よりも高くなる場合があります (一部のコンシューマーがスケジュールされているが、現時点では実行されていない場合)。
getActiveConsumerCount
public final int getActiveConsumerCount()現在アクティブなコンシューマーの数を返します。この数値は常に "concurrentConsumers" と "maxConcurrentConsumers" の間になりますが、"scheduledConsumerCount" より低くなる可能性があります (一部のコンシューマーがスケジュールされているが、現時点では実行されていない場合)。
isRegisteredWithDestination
public boolean isRegisteredWithDestination()少なくとも 1 つのコンシューマーがターゲット宛先への固定登録を行ったかどうかを返します。これは、公開しようとしているメッセージを見逃さないことが保証されている実際のコンシューマーを登録することが重要である pub-sub の場合に特に興味深いものです。このメソッドは、
start()
呼び出しの後、コンシューマーの非同期登録が発生するまでポーリングされます。このとき、メソッドはtrue
を返し始めます。ただし、リスナーコンテナーが実際に固定登録を確立する場合に限ります。その後、コンテナーは少なくとも 1 つのコンシューマー登録を保持するため、シャットダウンするまでtrue
を返し続けます。リスナーコンテナーは、最初に固定登録を持つことにバインドされていないことに注意してください。また、呼び出し元の実行ごとにコンシューマーを再作成し続ける場合もあります。これは特に
cache level
設定に依存します。CACHE_CONSUMER
のみが固定登録につながります。createDefaultTaskExecutor
デフォルトの TaskExecutor を作成します。明示的な TaskExecutor が指定されていない場合に呼び出されます。デフォルトの実装では、指定された Bean 名(または Bean 名が指定されていない場合はクラス名)をスレッド名の接頭辞として使用して
SimpleAsyncTaskExecutor
を構築します。doRescheduleTask
このリスナーコンテナーの TaskExecutor を介して、指定されたタスクを再実行します。- オーバーライド:
- クラス
AbstractJmsListeningContainer
のdoRescheduleTask
- パラメーター:
task
- 再スケジュールするタスクオブジェクト- 関連事項:
messageReceived
メッセージが入ってくることがわかっているため、新しい呼び出し側のスケジューリングを試みます...- オーバーライド:
- クラス
AbstractPollingMessageListenerContainer
のmessageReceived
- パラメーター:
invoker
- 呼び出し元オブジェクト (通りました)session
- 受信 JMS セッション- 関連事項:
noMessageReceived
影響を受ける呼び出し元をアイドルとしてマークします。- オーバーライド:
- クラス
AbstractPollingMessageListenerContainer
のnoMessageReceived
- パラメーター:
invoker
- 呼び出し元オブジェクト (通りました)session
- 受信 JMS セッション
scheduleNewInvokerIfAppropriate
protected void scheduleNewInvokerIfAppropriate()新しい呼び出し元をスケジュールし、このリスナーコンテナーのスケジュールされた呼び出し元の合計数を増やします。ただし、指定された "maxConcurrentConsumers" 制限にまだ達しておらず、指定された "idleConsumerLimit" にも達していない場合に限ります。最初にメッセージを受信した呼び出し元でメッセージを処理している間にスケールアップするために、メッセージが受信されると呼び出されます。
handleListenerSetupFailure
リスナーのセットアップ中に発生した特定の例外を処理します。すべての同時リスナーでそのようなすべての例外が呼び出されます。デフォルトの実装では、まだ回復されていない場合は警告レベルで、すでに回復されている場合はデバッグレベルで例外がログに記録されます。サブクラスでオーバーライドできます。
- パラメーター:
ex
- 処理する例外alreadyRecovered
- 以前に実行中のリスナーが、現在のリスナーのセットアップの失敗からすでに回復しているかどうか (これは通常、デバッグログ以外の目的で無視できるフォローアップエラーを示します。)- 関連事項:
recoverAfterListenerSetupFailure
protected void recoverAfterListenerSetupFailure()リスナーがそれ自体のセットアップに失敗した後、基礎となる接続の再確立など、このリスナーコンテナーを回復します。デフォルトの実装は、DefaultMessageListenerContainer のリカバリ可能な
refreshConnectionUntilSuccessful()
メソッドに委譲します。このメソッドは、共有接続と非共有接続の両方のケースで JMS プロバイダーへの接続の再確立を試みます。refreshConnectionUntilSuccessful
protected void refreshConnectionUntilSuccessful()試行が成功する前に戻るのではなく、基になる接続をリフレッシュします。共有接続の場合と共有接続なしの場合に呼び出されるため、共有接続または検証目的で確立されたばかりの一時接続で操作する必要があります。デフォルトの実装は、このメッセージリスナーコンテナーが実行されている限り、接続が正常に確立されるまで再試行します。再試行の間に指定された回復間隔を適用します。
refreshDestination
protected void refreshDestination()このリスナーコンテナーが動作する JMS 宛先をリフレッシュします。キャッシュされた Destination オブジェクトが無効になったと想定して、リスナーのセットアップが失敗した後に呼び出されます(WebLogic JMS の一般的なケース)。
デフォルトの実装では、CachingDestinationResolver の場合、DestinationResolver のキャッシュから宛先を削除します。
applyBackOffTime
指定されたBackOffExecution
を使用して、次のバックオフ時間を適用します。バックオフ期間が適用され、回復を新たに試行する必要がある場合は
true
を返し、それ以上試行しない場合はfalse
を返します。- 導入:
- 4.1
isRecovering
public final boolean isRecovering()このリスナーコンテナーが現在リカバリを試みているかどうかを返します。以前に
true
を返すことがわかった後、isRecovering()
がfalse
に切り替えて、回復フェーズを検出するために使用できます。