public abstract class AbstractPollingMessageListenerContainer extends AbstractMessageListenerContainer
MessageConsumer
EE に基づくリスナー処理のサポートを提供し、オプションで外部管理トランザクションに参加します。 このリスナーコンテナーバリアントは、それぞれ receiveAndExecute(java.lang.Object, javax.jms.Session, javax.jms.MessageConsumer)
メソッドを呼び出す、繰り返しのポーリング試行用に構築されています。使用される MessageConsumer は、到達試行のために再取得されるか、試行の間にキャッシュされます。これは具体的な実装次第です。各試行の受信タイムアウトは、"receiveTimeout"
プロパティを使用して構成できます。
基礎となるメカニズムは、標準の JMS MessageConsumer 処理に基づいています。これは、Java EE 環境のネイティブ JMS および JMS の両方と完全に互換性があります。JMS MessageConsumer.setMessageListener
機能も JMS ServerSessionPool 機能も必要ありません。このアプローチのもう 1 つの利点は、リスニングプロセスを完全に制御できることです。これにより、カスタムスケーリングとスロットル、同時メッセージ処理(具象サブクラスまで)が可能になります。
メッセージの受信とリスナーの実行は、Spring PlatformTransactionManager
を "transactionManager"
プロパティに渡すことにより、トランザクションに自動的にラップできます。これは通常、Java EE 環境の JtaTransactionManager
と、JNDI から取得した JTA 対応の JMS ConnectionFactory との組み合わせになります(アプリケーションサーバーのドキュメントを確認してください)。
この基本クラスは、ポーリング呼び出しの非同期実行のための特定のメカニズムを想定していません。DefaultMessageListenerContainer
をチェックして、Spring の TaskExecutor
抽象化に基づく具体的な実装について確認してください。これには、同時コンシューマーの動的スケーリングや自動自己回復などが含まれます。
AbstractJmsListeningContainer.SharedConnectionNotInitializedException
修飾子と型 | フィールドと説明 |
---|---|
static long | DEFAULT_RECEIVE_TIMEOUT デフォルトの受信タイムアウト: 1000 ms = 1 秒。 |
lifecycleMonitor, sharedConnectionMonitor
RECEIVE_TIMEOUT_INDEFINITE_WAIT, RECEIVE_TIMEOUT_NO_WAIT
logger
DEFAULT_PHASE
コンストラクターと説明 |
---|
AbstractPollingMessageListenerContainer() |
修飾子と型 | メソッドと説明 |
---|---|
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 | getReceiveTimeout() このリスナーコンテナーに構成されている受信タイムアウト(ミリ秒)を返します。 |
protected SessionEE | getSession(JmsResourceHolder holder) 指定された JmsResourceHolder から適切なセッションをフェッチします。 |
protected PlatformTransactionManager | getTransactionManager() メッセージ受信とリスナー実行のトランザクションラップに使用する Spring PlatformTransactionManager を返します。 |
void | initialize() このコンテナーを初期化します。 |
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) JMS Session EE の作成時に使用されるトランザクションモードを設定します。 |
void | setTransactionManager(PlatformTransactionManager transactionManager) メッセージ受信とリスナー実行のトランザクション折り返しに使用する Spring PlatformTransactionManager を指定します。 |
void | setTransactionName(StringSE transactionName) トランザクション折り返しに使用するトランザクション名を指定します。 |
void | setTransactionTimeout(int transactionTimeout) トランザクションラップに使用するトランザクションタイムアウトを秒単位で指定します。 |
protected boolean | shouldCommitAfterNoMessageReceived(SessionEE session) メッセージが受信されなかった後にコミットをトリガーするかどうかを決定します。 |
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, setConcurrency, setDestination, setDestinationName, setDurableSubscriptionName, setErrorHandler, setExceptionListener, setExposeListenerSession, setMessageConverter, setMessageListener, setMessageSelector, setPubSubNoLocal, setReplyPubSubDomain, setReplyQosSettings, setSubscriptionDurable, setSubscriptionName, setSubscriptionShared, setupMessageListener, validateConfiguration
afterPropertiesSet, createSharedConnection, destroy, doInitialize, doRescheduleTask, doShutdown, doStart, doStop, establishSharedConnection, getBeanName, getClientId, getPausedTaskCount, getPhase, getSharedConnection, isActive, isAutoStartup, isRunning, logRejectedTask, prepareSharedConnection, refreshSharedConnection, rescheduleTaskIfNecessary, resumePausedTasks, runningAllowed, setAutoStartup, setBeanName, setClientId, setPhase, sharedConnectionEnabled, shutdown, start, startSharedConnection, stop, stopSharedConnection
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, stop
public static final long DEFAULT_RECEIVE_TIMEOUT
public void setSessionTransacted(boolean sessionTransacted)
JmsAccessor
Session
EE の作成時に使用されるトランザクションモードを設定します。デフォルトは "false" です。JTA トランザクション内では、create(Queue/Topic)Session(boolean transacted, int acknowledgeMode)
メソッドに渡されたパラメーターは考慮されないことに注意してください。Java EE トランザクションコンテキストに応じて、コンテナーはこれらの値に対して独自の決定を行います。同様に、これらのパラメーターは、ローカルで管理されるトランザクション内でも考慮されません。これは、この場合、アクセサーが既存の JMS セッションを操作するためです。
このフラグを "true" に設定すると、管理対象トランザクションの外部で実行される場合は短いローカル JMS トランザクションが使用され、管理対象トランザクション(XA トランザクション以外)が存在する場合は同期されたローカル JMS トランザクションが使用されます。これには、ローカルトランザクションがメイントランザクション(ネイティブ JDBC トランザクションの場合もあります)とともに管理され、JMS トランザクションがメイントランザクションの直後にコミットされるという効果があります。
JmsAccessor
の setSessionTransacted
Connection.createSession(boolean, int)
EEpublic void setTransactionManager(@Nullable PlatformTransactionManager transactionManager)
PlatformTransactionManager
を指定します。 デフォルトは none で、トランザクション折り返しは実行されません。指定されている場合、これは通常、Spring JtaTransactionManager
またはそのサブクラスの 1 つであり、このメッセージリスナーコンテナーが接続を取得する JTA 対応の ConnectionFactory と組み合わせます。
注: 代わりにローカル JMS トランザクションの使用を検討してください。SessionAwareMessageListener
によって実行されるセッション操作(レスポンスメッセージの送信など)を含め、受信処理全体でローカルにトランザクション処理された JMS セッションを使用するには、"sessionTransacted"
フラグを "true" に切り替えるだけです。これにより、JmsTransactionManager
と同様に、ローカル JMS トランザクションに基づいて完全に同期された Spring トランザクションが可能になります。トランザクションの選択とメッセージの再配信シナリオについては、AbstractMessageListenerContainer
の javadoc を確認してください。
@Nullable protected final PlatformTransactionManager getTransactionManager()
public void setTransactionName(StringSE transactionName)
public void setTransactionTimeout(int transactionTimeout)
public void setReceiveTimeout(long receiveTimeout)
注意 : この値は、トランザクションマネージャーが使用するトランザクションタイムアウトよりも小さくする必要があります(もちろん、適切な単位で)。0 はタイムアウトがないことを示します。ただし、これはトランザクションマネージャー内で実行されていない場合にのみ実行可能であり、そのようなリスナーコンテナーは正常にシャットダウンできないため、通常は推奨されません。-1 などの負の値は、待機なしの受信操作を示します。
protected long getReceiveTimeout()
public void initialize()
AbstractJmsListeningContainer
JMS 接続を作成し、Connection
EE を開始し("autoStartup"
がオフになっていない場合)、AbstractJmsListeningContainer.doInitialize()
を呼び出します。
AbstractJmsListeningContainer
の initialize
protected MessageConsumerEE createListenerConsumer(SessionEE session) throws JMSExceptionEE
session
- 作業する JMS セッション JMSExceptionEE
- JMS メソッドによってスローされた場合 receiveAndExecute(java.lang.Object, javax.jms.Session, javax.jms.MessageConsumer)
protected boolean receiveAndExecute(ObjectSE invoker, @Nullable SessionEE session, @Nullable MessageConsumerEE consumer) throws JMSExceptionEE
session
- 作業する JMS セッション consumer
- MessageConsumer に取り組む JMSExceptionEE
- JMS メソッドによってスローされた場合 doReceiveAndExecute(java.lang.Object, javax.jms.Session, javax.jms.MessageConsumer, org.springframework.transaction.TransactionStatus)
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 メソッドによってスローされた場合 AbstractMessageListenerContainer.doExecuteListener(javax.jms.Session, javax.jms.Message)
protected boolean isSessionLocallyTransacted(SessionEE session)
AbstractMessageListenerContainer
の isSessionLocallyTransacted
session
- チェックするセッション JmsResourceHolder
protected boolean shouldCommitAfterNoMessageReceived(SessionEE session)
session
- メッセージを受信しなかった現在の JMS セッション AbstractMessageListenerContainer.commitIfNecessary(javax.jms.Session, javax.jms.Message)
を呼び出すかどうか @Nullable protected MessageEE receiveMessage(MessageConsumerEE consumer) throws JMSExceptionEE
consumer
- 使用する MessageConsumernull
JMSExceptionEE
- JMS メソッドによってスローされた場合 protected void messageReceived(ObjectSE invoker, SessionEE session)
invoker
- 呼び出し元オブジェクト (通りました)session
- 受信 JMS セッション protected void noMessageReceived(ObjectSE invoker, SessionEE session)
invoker
- 呼び出し元オブジェクト (通りました)session
- 受信 JMS セッション @Nullable protected ConnectionEE getConnection(JmsResourceHolder holder)
この実装は、すべての JMS 1.1 接続を受け入れます。
holder
- JmsResourceHoldernull
@Nullable protected SessionEE getSession(JmsResourceHolder holder)
この実装は、すべての JMS 1.1 セッションを受け入れます。
holder
- JmsResourceHoldernull