クラス AbstractPollingMessageListenerContainer
- 実装されたすべてのインターフェース:
Aware
、BeanNameAware
、DisposableBean
、InitializingBean
、Lifecycle
、Phased
、SmartLifecycle
、MessageListenerContainer
- 既知の直属サブクラス
DefaultMessageListenerContainer
MessageConsumer
EE に基づくリスナー処理のサポートを提供し、オプションで外部管理トランザクションに参加します。 このリスナーコンテナーバリアントは、それぞれ 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
抽象化に基づく具体的な実装について確認してください。これには、同時コンシューマーの動的スケーリングや自動自己回復などが含まれます。
ネストされたクラスのサマリー
クラス org.springframework.jms.listener.AbstractJmsListeningContainer から継承されたネストクラス / インターフェース
AbstractJmsListeningContainer.SharedConnectionNotInitializedException
フィールドサマリー
クラス 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 MessageConsumerEE
createListenerConsumer
(SessionEE session) 指定された JMS セッションの MessageConsumer を作成し、指定されたリスナーの MessageListener を登録します。protected boolean
doReceiveAndExecute
(ObjectSE invoker, SessionEE session, MessageConsumerEE consumer, TransactionStatus status) 実際に、指定されたコンシューマーから受信したメッセージのリスナーを実行し、すべてを取得するにはリソースが必要で、リスナーを呼び出します。protected ConnectionEE
getConnection
(JmsResourceHolder holder) 指定された JmsResourceHolder から適切な接続をフェッチします。protected long
このリスナーコンテナーに構成されている受信タイムアウト(ミリ秒)を返します。protected SessionEE
getSession
(JmsResourceHolder holder) 指定された JmsResourceHolder から適切なセッションをフェッチします。protected final PlatformTransactionManager
メッセージ受信とリスナー実行のトランザクションラップに使用する Spring PlatformTransactionManager を返します。void
このコンテナーを初期化します。protected boolean
isSessionLocallyTransacted
(SessionEE session) この実装は、セッションが外部的に同期されているかどうかを確認します。protected void
messageReceived
(ObjectSE invoker, SessionEE session) 新しいメッセージが受信されたときに、処理を試みる前に呼び出されるテンプレートメソッド。protected void
noMessageReceived
(ObjectSE invoker, SessionEE session) メッセージが受信されなかった場合に、受信ループに再び戻る前に呼び出されるテンプレートメソッド。protected boolean
receiveAndExecute
(ObjectSE invoker, SessionEE session, MessageConsumerEE consumer) 指定されたコンシューマーから受信したメッセージのリスナーを実行し、必要に応じて操作全体を外部トランザクションでラップします。protected MessageEE
receiveMessage
(MessageConsumerEE consumer) 指定されたコンシューマーからメッセージを受信します。void
setReceiveTimeout
(long receiveTimeout) 受信呼び出しに使用するタイムアウトをミリ秒単位で設定します。void
setSessionTransacted
(boolean sessionTransacted) JMSSession
EE の作成時に使用されるトランザクションモードを設定します。void
setTransactionManager
(PlatformTransactionManager transactionManager) メッセージ受信とリスナー実行のトランザクション折り返しに使用する SpringPlatformTransactionManager
を指定します。void
setTransactionName
(StringSE transactionName) トランザクション折り返しに使用するトランザクション名を指定します。void
setTransactionTimeout
(int transactionTimeout) トランザクションラップに使用するトランザクションタイムアウトを秒単位で指定します。protected boolean
メッセージが受信されなかった後にコミットをトリガーするかどうかを決定します。クラス 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, setConcurrency, 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, doInitialize, doRescheduleTask, doShutdown, doStart, doStop, establishSharedConnection, getBeanName, getClientId, getPausedTaskCount, getPhase, getSharedConnection, isActive, isAutoStartup, isRunning, logRejectedTask, prepareSharedConnection, refreshSharedConnection, releaseSharedConnection, rescheduleTaskIfNecessary, resumePausedTasks, runningAllowed, setAutoStartup, setBeanName, setClientId, setPhase, sharedConnectionEnabled, shutdown, start, startSharedConnection, stop, stopSharedConnection
クラス 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, stop
フィールドの詳細
DEFAULT_RECEIVE_TIMEOUT
public static final long DEFAULT_RECEIVE_TIMEOUTデフォルトの受信タイムアウト: 1000 ms = 1 秒。- 関連事項:
コンストラクターの詳細
AbstractPollingMessageListenerContainer
public AbstractPollingMessageListenerContainer()
メソッドの詳細
setSessionTransacted
public void setSessionTransacted(boolean sessionTransacted) クラスからコピーされた説明:JmsAccessor
JMSSession
EE の作成時に使用されるトランザクションモードを設定します。デフォルトは "false" です。JTA トランザクション内では、
create(Queue/Topic)Session(boolean transacted, int acknowledgeMode)
メソッドに渡されたパラメーターは考慮されないことに注意してください。Jakarta EE トランザクションコンテキストに応じて、コンテナーはこれらの値に対して独自の決定を行います。同様に、これらのパラメーターは、ローカルで管理されるトランザクション内でも考慮されません。これは、この場合、アクセサーが既存の JMS セッションを操作するためです。このフラグを "true" に設定すると、管理対象トランザクションの外部で実行する場合は短いローカル JMS トランザクションが使用され、管理対象トランザクション(XA トランザクション以外)が存在する場合は同期されたローカル JMS トランザクションが使用されます。これには、ローカル JMS トランザクションがメイントランザクション(ネイティブ JDBC トランザクションの場合もあります)と一緒に管理され、JMS トランザクションがメイントランザクションの直後にコミットされるという効果があります。
- オーバーライド:
- クラス
JmsAccessor
のsetSessionTransacted
- 関連事項:
setTransactionManager
メッセージ受信とリスナー実行のトランザクション折り返しに使用する SpringPlatformTransactionManager
を指定します。デフォルトは none で、トランザクション折り返しは実行されません。指定されている場合、これは通常、Spring
JtaTransactionManager
またはそのサブクラスの 1 つであり、このメッセージリスナーコンテナーが接続を取得する JTA 対応の ConnectionFactory と組み合わせます。注: 代わりにローカル JMS トランザクションの使用を検討してください。
SessionAwareMessageListener
によって実行されるセッション操作(レスポンスメッセージの送信など)を含め、受信処理全体でローカルにトランザクション処理された JMS セッションを使用するには、"sessionTransacted"
フラグを "true" に切り替えるだけです。これにより、JmsTransactionManager
と同様に、ローカル JMS トランザクションに基づいて完全に同期された Spring トランザクションが可能になります。トランザクションの選択とメッセージの再配信シナリオについては、AbstractMessageListenerContainer
の javadoc を確認してください。getTransactionManager
メッセージ受信とリスナー実行のトランザクションラップに使用する Spring PlatformTransactionManager を返します。setTransactionName
トランザクション折り返しに使用するトランザクション名を指定します。デフォルトは、このリスナーコンテナーの 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 接続を作成し、
Connection
EE を開始し("autoStartup"
がオフになっていない場合)、AbstractJmsListeningContainer.doInitialize()
を呼び出します。- オーバーライド:
- クラス
AbstractJmsListeningContainer
のinitialize
createListenerConsumer
指定された 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
この実装は、セッションが外部で同期されているかどうかを確認します。この場合、リスナーコンテナーの "sessionTransacted" フラグが "true" に設定されているにもかかわらず、セッションはローカルでトランザクション化されません。- オーバーライド:
- クラス
AbstractMessageListenerContainer
のisSessionLocallyTransacted
- パラメーター:
session
- チェックするセッション- 戻り値:
- 指定されたセッションがローカルでトランザクションされるかどうか
- 関連事項:
shouldCommitAfterNoMessageReceived
メッセージが受信されなかった後にコミットをトリガーするかどうかを決定します。これは、現代の JMS プロバイダーでは良い考えです。- パラメーター:
session
- メッセージを受信しなかった現在の JMS セッション- 戻り値:
- 指定されたセッションで
AbstractMessageListenerContainer.commitIfNecessary(jakarta.jms.Session, jakarta.jms.Message)
を呼び出すかどうか
receiveMessage
指定されたコンシューマーからメッセージを受信します。- パラメーター:
consumer
- 使用する MessageConsumer- 戻り値:
- メッセージ、ない場合は
null
- 例外:
JMSExceptionEE
- JMS メソッドによってスローされた場合
messageReceived
新しいメッセージが受信されたときに、処理を試みる前に呼び出されるテンプレートメソッド。サブクラスが実際の受信メッセージのイベントに反応できるようにします。たとえば、コンシューマー数を調整します。- パラメーター:
invoker
- 呼び出し元オブジェクト (通りました)session
- 受信 JMS セッション
noMessageReceived
メッセージが受信されなかった場合に、受信ループに再び戻る前に呼び出されるテンプレートメソッド。サブクラスが受信メッセージのないイベントに反応できるようにします。たとえば、呼び出し元をアイドルとしてマークします。- パラメーター:
invoker
- 呼び出し元オブジェクト (通りました)session
- 受信 JMS セッション
getConnection
指定された JmsResourceHolder から適切な接続をフェッチします。この実装は、すべての JMS 1.1 接続を受け入れます。
- パラメーター:
holder
- JmsResourceHolder- 戻り値:
- ホルダーからフェッチされた適切な接続、または見つからない場合は
null
getSession
指定された JmsResourceHolder から適切なセッションをフェッチします。この実装は、すべての JMS 1.1 セッションを受け入れます。
- パラメーター:
holder
- JmsResourceHolder- 戻り値:
- ホルダーからフェッチされた適切なセッション、または見つからない場合は
null