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