public abstract class AbstractMessageListenerContainer extends AbstractJmsListeningContainer implements MessageListenerContainer
MessageListener
EE または Spring の SessionAwareMessageListener
をホストできます。 通常、すべてのリスナーが登録されることになっている単一の JMS Connection
EE を保持します。これは、リスナーセッションを管理する標準の JMS 方法です。あるいは、Java EE スタイルの XA 対応 JMS メッセージングのために、リスナーごとの新しい接続で使用することもできます。実際の登録プロセスは具象サブクラス次第です。
注 : このメッセージリスナーコンテナーのデフォルトの動作では、メッセージリスナーによってスローされた例外が JMS プロバイダーに伝播されることはありません。代わりに、エラーレベルでそのような例外をログに記録します。つまり、アテンダント JMS プロバイダーの観点からは、そのようなリスナーが失敗することはありません。ただし、エラー処理が必要な場合は、ErrorHandler
戦略の実装を setErrorHandler(ErrorHandler)
メソッドに提供できます。JMSExceptions は、ExceptionListener
EE に渡される(提供されている場合)のに加えて(その後に)ErrorHandler に渡されることに注意してください。
リスナーコンテナーは、次のメッセージ確認オプションを提供します。
DefaultMessageListenerContainer
の場合、リスナー実行前に自動メッセージ確認が行われ、例外が発生した場合の再配信はなく、他のリスナー実行の中断が発生した場合の再配信もありません。SimpleMessageListenerContainer
の場合、リスナー実行後に自動メッセージ確認が行われ、ユーザー例外がスローされた場合の再配信はありませんが、リスナー実行中に JVM が停止した場合は再配信される可能性があります。あらゆるコンテナーバリアントで一貫して再配信を行うには、"CLIENT_ACKNOWLEDGE" モードを検討するか、代わりに "sessionTransacted" を "true" に設定することを推奨します。DefaultMessageListenerContainer
) または直後 (SimpleMessageListenerContainer
) の遅延メッセージ確認。ユーザー例外がスローされた場合は再配信されませんが、リスナー実行中に JVM が停止した場合は再配信される可能性があります。どのコンテナーバリアントでも一貫して再配信を行うには、"CLIENT_ACKNOWLEDGE" モードを検討するか、代わりに "sessionTransacted" を "true" に設定することをお勧めします。重複メッセージ処理の問題には 2 つの解決策があります。
JtaTransactionManager
で、対応する XA 対応 JMS ConnectionFactory
EE が "connectionFactory" として渡されます) を指定することによって、DefaultMessageListenerContainer
でのみサポートされます。推奨:
JtaTransactionManager
を "transactionManager" として指定します。これは、通常は Java EE サーバーで実行する場合ですが、JTA トランザクションマネージャーが存在する他の環境でも当てはまります。これにより、追加の実行時処理オーバーヘッドを犠牲にして、カスタム重複メッセージチェックなしで完全な「正確に 1 回」の保証が得られます。 トランザクションを外部で管理する必要がない場合は、JmsTransactionManager
よりも "sessionTransacted" フラグを強く推奨します。JTA を使用している場合、またはカスタムの外部トランザクション構成と同期する必要がある場合にのみ、トランザクションマネージャーを設定してください。
setMessageListener(java.lang.Object)
, MessageListener
EE, SessionAwareMessageListener
, handleListenerException(java.lang.Throwable)
, DefaultMessageListenerContainer
, SimpleMessageListenerContainer
, JmsMessageEndpointManager
AbstractJmsListeningContainer.SharedConnectionNotInitializedException
lifecycleMonitor, sharedConnectionMonitor
RECEIVE_TIMEOUT_INDEFINITE_WAIT, RECEIVE_TIMEOUT_NO_WAIT
logger
DEFAULT_PHASE
コンストラクターと説明 |
---|
AbstractMessageListenerContainer() |
修飾子と型 | メソッドと説明 |
---|---|
protected void | checkMessageListener(ObjectSE messageListener) 指定されたメッセージリスナーを確認し、サポートされているリスナー型に対応していない場合は例外をスローします。 |
protected void | commitIfNecessary(SessionEE session, MessageEE message) 必要に応じて、コミットまたはメッセージ確認を実行します。 |
protected MessageConsumerEE | createConsumer(SessionEE session, DestinationEE destination) 指定されたセッションと宛先の JMS MessageConsumer を作成します。 |
protected void | doExecuteListener(SessionEE session, MessageEE message) 指定されたリスナーを実行し、後でトランザクションをコミットまたはロールバックします(必要な場合)。 |
protected void | doInvokeListener(MessageListenerEE listener, MessageEE message) 指定したリスナーを標準 JMS MessageListener として呼び出します。 |
protected void | doInvokeListener(SessionAwareMessageListener listener, SessionEE session, MessageEE message) 指定されたリスナーを Spring SessionAwareMessageListener として呼び出し、要求された場合は新しい JMS セッションを(潜在的に独自のトランザクションで)リスナーに公開します。 |
protected void | executeListener(SessionEE session, MessageEE message) 指定されたリスナーを実行し、後でトランザクションをコミットまたはロールバックします(必要な場合)。 |
protected StringSE | getDefaultSubscriptionName(ObjectSE messageListener) 指定されたメッセージリスナーのデフォルトのサブスクリプション名を決定します。 |
DestinationEE | getDestination() メッセージを受け取る宛先を返します。 |
protected StringSE | getDestinationDescription() このコンテナーの JMS 宛先を説明する文字列を返します(決して null ではありません)。 |
StringSE | getDestinationName() メッセージを受信する宛先の名前を返します。 |
StringSE | getDurableSubscriptionName() 作成する永続サブスクリプションの名前を返します(存在する場合)。 |
ErrorHandler | getErrorHandler() メッセージの処理中にスローされたキャッチされない例外の場合に呼び出される ErrorHandler を返します。 |
ExceptionListenerEE | getExceptionListener() 登録されたメッセージリスナーまたは呼び出しインフラストラクチャ(存在する場合)によって JMSException がスローされた場合に通知する JMS ExceptionListener を返します。 |
MessageConverter | getMessageConverter() Message EE があれば、それを変換するために使用できる MessageConverter を返します。 |
ObjectSE | getMessageListener() 登録するメッセージリスナーオブジェクトを返します。 |
StringSE | getMessageSelector() JMS メッセージセレクター式(ない場合は null )を返します。 |
QosSettings | getReplyQosSettings() 応答を送信するときに使用する QosSettings を返すか、ブローカーのデフォルトを使用する必要がある場合は null を返します。 |
StringSE | getSubscriptionName() 作成するサブスクリプションの名前を返します(ある場合)。 |
protected void | handleListenerException(ThrowableSE ex) リスナーの実行中に発生した特定の例外を処理します。 |
protected void | invokeErrorHandler(ThrowableSE ex) 登録済みの ErrorHandler があれば呼び出します。 |
protected void | invokeExceptionListener(JMSExceptionEE ex) 登録済みの JMS ExceptionListener があれば呼び出します。 |
protected void | invokeListener(SessionEE session, MessageEE message) 指定されたリスナーを呼び出す: 標準的な JMS の MessageListener または、(できれば)Spring の SessionAwareMessageListener。 |
boolean | isAcceptMessagesWhileStopping() リスナーコンテナーが停止している間に受信メッセージを受け入れるかどうかを返します。 |
boolean | isExposeListenerSession() リスナー JMS Session EE を登録済みの SessionAwareMessageListener に公開するかどうかを返します。 |
boolean | isPubSubNoLocal() 独自の接続によって公開されたメッセージの配信を禁止するかどうかを返します。 |
boolean | isReplyPubSubDomain() パブリッシュ / サブスクライブドメイン( Topics EE)が返信に使用されるかどうかを返します。 |
protected boolean | isSessionLocallyTransacted(SessionEE session) 指定されたセッションがローカルでトランザクション処理されているかどうか、つまり、そのトランザクションが外部リスナーのコーディネーターではなく、このリスナーコンテナーのセッション処理によって管理されているかどうかを確認します。 |
boolean | isSubscriptionDurable() サブスクリプションを永続的にするかどうかを返します。 |
boolean | isSubscriptionShared() サブスクリプションを共有するかどうかを返します。 |
protected void | rollbackIfNecessary(SessionEE session) 必要に応じて、ロールバックを実行します。 |
protected void | rollbackOnExceptionIfNecessary(SessionEE session, ThrowableSE ex) ロールバックを実行し、ロールバック例外を適切に処理します。 |
void | setAcceptMessagesWhileStopping(boolean acceptMessagesWhileStopping) リスナコンテナーの停止中に受信メッセージを受け入れるかどうかを設定します。 |
abstract void | setConcurrency(StringSE concurrency) 同時実行制限を指定します。 |
void | setDestination(DestinationEE destination) メッセージの送信先を設定します。 |
void | setDestinationName(StringSE destinationName) メッセージを受信する宛先の名前を設定します。 |
void | setDurableSubscriptionName(StringSE durableSubscriptionName) 作成する永続サブスクリプションの名前を設定します。 |
void | setErrorHandler(ErrorHandler errorHandler) メッセージの処理中にスローされたキャッチされない例外が発生した場合に呼び出されるように ErrorHandler を設定します。 |
void | setExceptionListener(ExceptionListenerEE exceptionListener) 登録されたメッセージリスナーまたは呼び出しインフラストラクチャによって JMSException がスローされた場合に通知するように JMS ExceptionListener を設定します。 |
void | setExposeListenerSession(boolean exposeListenerSession) リスナー JMS セッションを登録済みの SessionAwareMessageListener および JmsTemplate 呼び出しに公開するかどうかを設定します。 |
void | setMessageConverter(MessageConverter messageConverter) JMS メッセージを変換するための MessageConverter 戦略を設定します。 |
void | setMessageListener(ObjectSE messageListener) 登録するメッセージリスナーの実装を設定します。 |
void | setMessageSelector(StringSE messageSelector) JMS メッセージセレクター式を設定します(ない場合は null )。 |
void | setPubSubNoLocal(boolean pubSubNoLocal) 独自の接続によって公開されたメッセージの配信を禁止するかどうかを設定します。 |
void | setReplyPubSubDomain(boolean replyPubSubDomain) 返信先の種類を設定します。 |
void | setReplyQosSettings(QosSettings replyQosSettings) 返信を送信するときに使用する QosSettings を構成します。 |
void | setSubscriptionDurable(boolean subscriptionDurable) サブスクリプションを永続的にするかどうかを設定します。 |
void | setSubscriptionName(StringSE subscriptionName) 作成するサブスクリプションの名前を設定します。 |
void | setSubscriptionShared(boolean subscriptionShared) サブスクリプションを共有するかどうかを設定します。 |
void | setupMessageListener(ObjectSE messageListener) 使用するメッセージリスナーを設定します。 |
protected void | validateConfiguration() このコンテナーの構成を検証します。 |
afterPropertiesSet, createSharedConnection, destroy, doInitialize, doRescheduleTask, doShutdown, doStart, doStop, establishSharedConnection, getBeanName, getClientId, getPausedTaskCount, getPhase, getSharedConnection, initialize, 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, setSessionTransacted
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
getDestinationResolver, isPubSubDomain
getPhase, isAutoStartup, stop
public abstract void setConcurrency(StringSE concurrency)
public void setDestination(@Nullable DestinationEE destination)
あるいは、DestinationResolver
を介して動的に解決される "destinationName" を指定します。
メモ: 宛先は実行時に置き換えられ、リスナーコンテナーが新しい宛先をすぐに取得します(たとえば、キャッシュレベルが CACHE_CONSUMER 未満である限り、DefaultMessageListenerContainer で機能します)。ただし、これは高度な使用箇所と見なされます。注意して使用してください!
@Nullable public DestinationEE getDestination()
Destination
EE 型でない場合は、null
になります。c.f. when the destination is a String
。public void setDestinationName(@Nullable StringSE destinationName)
指定された名前は、構成された destination resolver
を介して動的に解決されます。
または、JMS Destination
EE オブジェクトを「宛先」として指定します。
メモ: 宛先は実行時に置き換えられ、リスナーコンテナーが新しい宛先をすぐに取得します(たとえば、キャッシュレベルが CACHE_CONSUMER 未満である限り、DefaultMessageListenerContainer で機能します)。ただし、これは高度な使用箇所と見なされます。注意して使用してください!
protected StringSE getDestinationDescription()
null
ではありません)。public void setMessageSelector(@Nullable StringSE messageSelector)
null
)。デフォルトはなしです。セレクター式の詳細な定義については、JMS 仕様を参照してください。
メモ: メッセージセレクターは実行時に置き換えられ、リスナーコンテナーは新しいセレクター値をすぐに取得します(たとえば、キャッシュレベルが CACHE_CONSUMER 未満である限り、DefaultMessageListenerContainer で機能します)。ただし、これは高度な使用箇所と見なされます。注意して使用してください!
public void setMessageListener(@Nullable ObjectSE messageListener)
MessageListener
EE オブジェクトまたは Spring SessionAwareMessageListener
オブジェクトのいずれかです。メモ: メッセージリスナーは実行時に置き換えられ、リスナーコンテナーは新しいリスナーオブジェクトをすぐに取得します(たとえば、キャッシュレベルが CACHE_CONSUMER 未満である限り、DefaultMessageListenerContainer で動作します)。ただし、これは高度な使用箇所と見なされます。注意して使用してください!
IllegalArgumentExceptionSE
- 指定されたリスナーが MessageListener
EE でも SessionAwareMessageListener
でもない場合 MessageListener
EE, SessionAwareMessageListener
protected void checkMessageListener(@Nullable ObjectSE messageListener)
デフォルトでは、標準の JMS MessageListener
EE オブジェクトまたは Spring SessionAwareMessageListener
オブジェクトのみが受け入れられます。
messageListener
- チェックするメッセージリスナーオブジェクト IllegalArgumentExceptionSE
- 指定されたリスナーが MessageListener
EE でも SessionAwareMessageListener
でもない場合 MessageListener
EE, SessionAwareMessageListener
protected StringSE getDefaultSubscriptionName(ObjectSE messageListener)
messageListener
- チェックするメッセージリスナーオブジェクト SubscriptionNameProvider
public void setSubscriptionDurable(boolean subscriptionDurable)
デフォルトは "false" です。永続サブスクリプションを登録するには、これを "true" に設定します。通常は "subscriptionName" 値と組み合わせて使用します (メッセージリスナークラス名がサブスクリプション名として十分な場合を除く)。
トピック (pub-sub ドメイン) をリッスンしている場合にのみ意味があるため、このメソッドは "pubSubDomain" フラグも切り替えます。
public boolean isSubscriptionDurable()
public void setSubscriptionShared(boolean subscriptionShared)
デフォルトは "false" です。共有サブスクリプションを登録するには、これを "true" に設定します。通常は "subscriptionName" 値と組み合わせて使用します (メッセージリスナークラス名がサブスクリプション名として十分な場合を除く)。共有サブスクリプションは永続的である場合もあるため、このフラグは "subscriptionDurable" と組み合わせて使用することもできます (多くの場合、そうします)。
トピック (pub-sub ドメイン) をリッスンしている場合にのみ意味があるため、このメソッドは "pubSubDomain" フラグも切り替えます。
JMS 2.0 互換のメッセージブローカーが必要です。
public boolean isSubscriptionShared()
public void setSubscriptionName(@Nullable StringSE subscriptionName)
サブスクリプション名は、このクライアントの JMS クライアント ID 内で一意である必要があります。デフォルトは、指定されたメッセージリスナーのクラス名です。
メモ: 共有サブスクリプション(JMS 2.0 が必要)を除き、各サブスクリプションで許可される同時コンシューマーは 1 つ(このメッセージリスナーコンテナーのデフォルト)です。
@Nullable public StringSE getSubscriptionName()
public void setDurableSubscriptionName(@Nullable StringSE durableSubscriptionName)
永続サブスクリプション名は、このクライアントの JMS クライアント ID 内で一意である必要があります。デフォルトは、指定されたメッセージリスナーのクラス名です。
メモ: 共有永続サブスクリプション(JMS 2.0 が必要)を除いて、各永続サブスクリプションで許可される同時コンシューマーは 1 つだけです(これはこのメッセージリスナーコンテナーのデフォルトです)。
@Nullable public StringSE getDurableSubscriptionName()
public void setPubSubNoLocal(boolean pubSubNoLocal)
public boolean isPubSubNoLocal()
public void setReplyPubSubDomain(boolean replyPubSubDomain)
pubSubDomain
値が使用されます(JmsDestinationAccessor.isPubSubDomain()
を参照)。この設定は、動的宛先が有効な場合に解決する宛先の型を主に示します。
replyPubSubDomain
- パブリッシュ / サブスクライブドメイン(Topics
EE)の場合は "true"、ポイントツーポイントドメインの場合は "false" ( Queues
EE )JmsDestinationAccessor.setDestinationResolver(org.springframework.jms.support.destination.DestinationResolver)
public boolean isReplyPubSubDomain()
MessageListenerContainer
の isReplyPubSubDomain
public void setReplyQosSettings(@Nullable QosSettings replyQosSettings)
QosSettings
を構成します。null
に設定して、ブローカーのデフォルトを使用する必要があることを示すことができます。replyQosSettings
- 応答を送信するときに使用する QoS 設定、またはデフォルトの vas を使用するための null
@Nullable public QosSettings getReplyQosSettings()
MessageListenerContainer
QosSettings
を返すか、ブローカーのデフォルトを使用する必要がある場合は null
を返します。MessageListenerContainer
の getReplyQosSettings
public void setMessageConverter(@Nullable MessageConverter messageConverter)
MessageConverter
戦略を設定します。@Nullable public MessageConverter getMessageConverter()
MessageListenerContainer
Message
EE があれば、それを変換するために使用できる MessageConverter
を返します。MessageListenerContainer
の getMessageConverter
public void setExceptionListener(@Nullable ExceptionListenerEE exceptionListener)
@Nullable public ExceptionListenerEE getExceptionListener()
public void setErrorHandler(@Nullable ErrorHandler errorHandler)
デフォルトでは、ErrorHandler は存在しないため、エラーレベルのログが唯一の結果になります。
@Nullable public ErrorHandler getErrorHandler()
public void setExposeListenerSession(boolean exposeListenerSession)
SessionAwareMessageListener
および JmsTemplate
呼び出しに公開するかどうかを設定します。 デフォルトは "true" で、リスナーの Session
EE を再利用します。これをオフにすると、一部の JMS プロバイダーで必要になる可能性のある、同じ基礎となる JMS Connection
EE からフェッチされた新しい JMS セッションが公開されます。
外部トランザクションマネージャーによって管理されるセッションは、常に JmsTemplate
呼び出しに公開されることに注意してください。JmsTemplate 露出に関しては、この設定はローカルでトランザクション処理されたセッションにのみ影響します。
public boolean isExposeListenerSession()
Session
EE を登録済みの SessionAwareMessageListener
に公開するかどうかを返します。public void setAcceptMessagesWhileStopping(boolean acceptMessagesWhileStopping)
デフォルトは "false" で、受信の試行を中止することでそのようなメッセージを拒否します。停止フェーズでもこのようなメッセージを完全に処理するには、このフラグをオンにします。ただし、新しく送信されたメッセージでも処理される可能性があるという欠点があります(すべての受信タイムアウトが期限切れになる前に受信した場合)。
注意 : このような受信メッセージの受信試行を中止すると、影響を受けるメッセージのプロバイダーの再試行回数が減少する可能性があります。同時コンシューマーの数が多い場合は、すべての潜在的な停止シナリオで安全を確保するために、リトライの数がコンシューマーの数よりも多いことを確認してください。
public boolean isAcceptMessagesWhileStopping()
protected void validateConfiguration()
AbstractJmsListeningContainer
デフォルトの実装は空です。サブクラスでオーバーライドされます。
AbstractJmsListeningContainer
の validateConfiguration
public void setupMessageListener(ObjectSE messageListener)
MessageListenerContainer
IllegalArgumentException
SE をスローします。MessageListenerContainer
の setupMessageListener
protected void executeListener(SessionEE session, MessageEE message)
session
- 操作する JMS セッション message
- 受信した JMS メッセージ invokeListener(javax.jms.Session, javax.jms.Message)
, commitIfNecessary(javax.jms.Session, javax.jms.Message)
, rollbackOnExceptionIfNecessary(javax.jms.Session, java.lang.Throwable)
, handleListenerException(java.lang.Throwable)
protected void doExecuteListener(SessionEE session, MessageEE message) throws JMSExceptionEE
session
- 操作する JMS セッション message
- 受信した JMS メッセージ JMSExceptionEE
- JMS API メソッドによってスローされた場合 invokeListener(javax.jms.Session, javax.jms.Message)
, commitIfNecessary(javax.jms.Session, javax.jms.Message)
, rollbackOnExceptionIfNecessary(javax.jms.Session, java.lang.Throwable)
, JmsAccessor.convertJmsAccessException(javax.jms.JMSException)
protected void invokeListener(SessionEE session, MessageEE message) throws JMSExceptionEE
session
- 操作する JMS セッション message
- 受信した JMS メッセージ JMSExceptionEE
- JMS API メソッドによってスローされた場合 setMessageListener(java.lang.Object)
protected void doInvokeListener(SessionAwareMessageListener listener, SessionEE session, MessageEE message) throws JMSExceptionEE
listener
- 呼び出す Spring SessionAwareMessageListenersession
- 操作する JMS セッション message
- 受信した JMS メッセージ JMSExceptionEE
- JMS API メソッドによってスローされた場合 SessionAwareMessageListener
, setExposeListenerSession(boolean)
protected void doInvokeListener(MessageListenerEE listener, MessageEE message) throws JMSExceptionEE
デフォルトの実装では、onMessage
メソッドの単純な呼び出しを実行します。
listener
- 呼び出す JMS MessageListenermessage
- 受信した JMS メッセージ JMSExceptionEE
- JMS API メソッドによってスローされた場合 MessageListener.onMessage(javax.jms.Message)
EEprotected void commitIfNecessary(SessionEE session, @Nullable MessageEE message) throws JMSExceptionEE
session
- コミットする JMS セッション message
- 確認するメッセージ JMSExceptionEE
- コミット失敗の場合 protected void rollbackIfNecessary(SessionEE session) throws JMSExceptionEE
session
- ロールバックする JMS セッション JMSExceptionEE
- ロールバックエラーの場合 protected void rollbackOnExceptionIfNecessary(SessionEE session, ThrowableSE ex) throws JMSExceptionEE
session
- ロールバックする JMS セッション ex
- スローされたアプリケーションの例外またはエラー JMSExceptionEE
- ロールバックエラーの場合 protected boolean isSessionLocallyTransacted(SessionEE session)
メモ: セッション自体のトランザクション済みフラグは、以前にすでにチェックされています。このメソッドは、セッションのトランザクションがローカルであるか、外部で調整されているかを確認するためのものです。
session
- チェックするセッション JmsAccessor.isSessionTransacted()
, ConnectionFactoryUtils.isSessionTransactional(javax.jms.Session, javax.jms.ConnectionFactory)
protected MessageConsumerEE createConsumer(SessionEE session, DestinationEE destination) throws JMSExceptionEE
この実装では、JMS 1.1 API を使用します。
session
- MessageConsumer を作成する JMS セッション destination
- MessageConsumer を作成する JMS 宛先 JMSExceptionEE
- JMS API メソッドによってスローされた場合 protected void handleListenerException(ThrowableSE ex)
デフォルトの実装では、例外が警告レベルでログに記録され、JMS プロバイダーに伝達されません — 確認応答やトランザクションのすべての処理は、このリスナーコンテナーによって行われると想定しています。これはサブクラスでオーバーライドできます。
ex
- 処理する例外 protected void invokeExceptionListener(JMSExceptionEE ex)
ex
- JMS 処理中に発生した例外 setExceptionListener(javax.jms.ExceptionListener)
protected void invokeErrorHandler(ThrowableSE ex)
ex
- JMS 処理中に発生したキャッチされていないエラー。setErrorHandler(org.springframework.util.ErrorHandler)