@ManagedResource @IntegrationManagedResource public class DelayHandler extends AbstractReplyProducingMessageHandler implements DelayHandlerManagement, ApplicationListener<ContextRefreshedEvent>
Message
での delayExpression
の評価結果、またはこのハンドラーで構成されたデフォルトの遅延値に基づいて、メッセージフローの継続を遅延させることができる MessageHandler
。フローの継続は TaskScheduler
に委譲されるため、呼び出しスレッドはブロックしないことに注意してください。このアプローチの利点は、ブロックされたスレッドの蓄積を生成することなく、非常に長い遅延であっても、多くの遅延を同時に管理できることです。ただし、覚えておくべきことの 1 つは、アクティブなトランザクションコンテキストが元の送信者から最終的な受信者に伝播されないことです。これは、制御中の別のスレッドでの遅延後にメッセージを出力チャネルに渡すことの副作用です。
このハンドラーの delayExpression
プロパティが構成されている場合、その評価結果値はハンドラーの defaultDelay
値よりも優先されます。実際の評価結果の値は、long、long として解析できる文字列、Date の場合があります。長い場合は、現在の時刻から数えてミリ秒単位で遅延する時間の長さとして解釈されます(たとえば、値 5000 は、現在の時刻から 5 秒でメッセージを解放できることを示します)。値が日付の場合、少なくともその日付が発生するまで遅延します(つまり、その場合の遅延は headerDate.getTime() - new Date().getTime()
と同等です)。
修飾子と型 | クラスと説明 |
---|---|
static class | DelayHandler.DelayedMessageWrapper |
AbstractReplyProducingMessageHandler.RequestHandler
IntegrationManagement.ManagementOverrides
修飾子と型 | フィールドと説明 |
---|---|
static int | DEFAULT_MAX_ATTEMPTS |
static long | DEFAULT_RETRY_DELAY |
messagingTemplate
EXPRESSION_PARSER, logger
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
METER_PREFIX, RECEIVE_COUNTER_NAME, SEND_TIMER_NAME
コンストラクターと説明 |
---|
DelayHandler(StringSE messageGroupId) 指定された "messageGroupId" を使用して DelayHandler を作成し、これを MessageGroup の「キー」として使用して、遅延されたメッセージを MessageGroupStore に格納します。 |
DelayHandler(StringSE messageGroupId, TaskScheduler taskScheduler) 指定されたデフォルトの遅延で DelayHandler を作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
protected void | doInit() |
StringSE | getComponentType() サブクラスはこのメソッドを実装して、コンポーネント型情報を提供できます。 |
int | getDelayedMessageCount() |
IntegrationPatternType | getIntegrationPatternType() このコンポーネントが実装するパターン型を返します。 |
protected ObjectSE | handleRequestMessage(Message<?> requestMessage) 'requestMessage' が以前に遅延されていなかったかどうかを確認します ( releaseMessageAfterDelay(org.springframework.messaging.Message<?>, long) および DelayHandler.DelayedMessageWrapper )。 |
void | onApplicationEvent(ContextRefreshedEvent event) ContextRefreshedEvent を処理して、アプリケーションコンテキストの起動後できるだけ遅く reschedulePersistedMessages() を呼び出します。 |
protected void | rescheduleAt(Message<?> message, DateSE startTime) |
void | reschedulePersistedMessages() 'messageStore' 内の永続的なメッセージを読み取って再スケジュールするために使用されます (例: |
void | setDefaultDelay(long defaultDelay) デフォルトの遅延をミリ秒単位で設定します。 |
void | setDelayedAdviceChain(ListSE<Advice> delayedAdviceChain) List<Advice> を指定して、DelayHandler.ReleaseMessageHandler プロキシに通知します。 |
void | setDelayedMessageErrorChannel(MessageChannel delayedMessageErrorChannel) リリースされたメッセージの送信に失敗した場合に ErrorMessage が送信されるメッセージチャネルを設定します。 |
void | setDelayedMessageErrorChannelName(StringSE delayedMessageErrorChannelName) 解放されたメッセージの送信に失敗した場合に ErrorMessage が送信されるメッセージチャネル名を設定します。 |
void | setDelayExpression(Expression delayExpression) 遅延期間(ミリ秒単位)または遅延する日付をチェックする必要がある Expression を指定します。 |
void | setDelayExpressionString(StringSE delayExpression) 遅延期間(ミリ秒単位)または遅延する日付をチェックする必要がある Expression を指定します。 |
void | setIgnoreExpressionFailures(boolean ignoreExpressionFailures) delayExpression 評価によってスローされた Exceptions を無視するかどうかを指定します(ログに記録されるだけです)。 |
void | setMaxAttempts(int maxAttempts) メッセージのリリースが失敗した場合のリリースの最大試行回数を設定します。 |
void | setMessageStore(MessageGroupStore messageStore) 遅延を待機している間にメッセージを保管するために使用する必要がある MessageGroupStore を指定します。 |
void | setRetryDelay(long retryDelay) リリース失敗後に再試行するときに適用する追加の遅延を設定します。 |
protected boolean | shouldCopyRequestHeaders() サブクラスはこれをオーバーライドできます。 |
doInvokeAdvisedRequestHandler, getBeanClassLoader, getRequiresReply, handleMessageInternal, hasAdviceChain, onInit, setAdviceChain, setBeanClassLoader, setRequiresReply
addNotPropagatedHeaders, createOutputMessage, getNotPropagatedHeaders, getOutputChannel, isAsync, messageBuilderForReply, produceOutput, resolveErrorChannel, sendErrorMessage, sendOutput, sendOutputs, setAsync, setNotPropagatedHeaders, setOutputChannel, setOutputChannelName, setSendTimeout, shouldSplitOutput, updateNotPropagatedHeaders
handleMessage, onComplete, onError, onNext, onSubscribe
buildSendTimer, destroy, getManagedName, getManagedType, getMetricsCaptor, getOrder, getOverrides, isLoggingEnabled, registerMetricsCaptor, sendTimer, setLoggingEnabled, setManagedName, setManagedType, setOrder, setShouldTrack, shouldTrack
afterPropertiesSet, extractTypeIfPossible, generateId, getApplicationContext, getApplicationContextId, getBeanDescription, getBeanFactory, getBeanName, getChannelResolver, getComponentName, getConversionService, getExpression, getIntegrationProperties, getIntegrationProperty, getMessageBuilderFactory, getTaskScheduler, isInitialized, setApplicationContext, setBeanFactory, setBeanName, setChannelResolver, setComponentName, setConversionService, setMessageBuilderFactory, setPrimaryExpression, setTaskScheduler, toString
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, waitSE, waitSE, waitSE
forPayload
getThisAs
getBeanName, getComponentName
public static final int DEFAULT_MAX_ATTEMPTS
public static final long DEFAULT_RETRY_DELAY
public DelayHandler(StringSE messageGroupId)
MessageGroup
が遅延メッセージを MessageGroupStore
に保存するための「キー」として使用します。遅延後のメッセージの送信は、ApplicationContext のデフォルト ThreadPoolTaskScheduler
に登録されて処理されます。messageGroupId
- メッセージグループ識別子。IntegrationObjectSupport.getTaskScheduler()
public DelayHandler(StringSE messageGroupId, TaskScheduler taskScheduler)
TaskScheduler
によって処理されます。messageGroupId
- メッセージグループ識別子。taskScheduler
- タスクスケジューラ。public void setDefaultDelay(long defaultDelay)
delayExpression
プロパティが指定されていない場合、デフォルトの遅延がすべてのメッセージに適用されます。評価結果が delayExpression
のメッセージにのみ遅延を適用する必要がある場合は、この値を 0 に設定します。defaultDelay
- ミリ秒単位のデフォルトの遅延。public void setDelayExpression(Expression delayExpression)
Expression
を指定します。このプロパティが設定されている場合、式の評価の結果(null でない場合)は、このハンドラーのデフォルトの遅延よりも優先されます。delayExpression
- 遅延式。public void setDelayExpressionString(StringSE delayExpression)
Expression
を指定します。このプロパティが設定されている場合、式の評価の結果(null でない場合)は、このハンドラーのデフォルトの遅延よりも優先されます。delayExpression
- 遅延式。public void setIgnoreExpressionFailures(boolean ignoreExpressionFailures)
delayExpression
評価によってスローされた Exceptions
を無視するかどうかを指定します(ログに記録されるだけです)。この場合、遅延は defaultDelay
にフォールバックします。このプロパティが false
として指定されている場合、delayExpression
評価 Exception
は、defaultDelay
にフォールバックせずに呼び出し元にスローされます。デフォルトは true
です。ignoreExpressionFailures
- 式の評価の失敗を無視する必要がある場合は true。determineDelayForMessage(org.springframework.messaging.Message<?>)
public void setMessageStore(MessageGroupStore messageStore)
MessageGroupStore
を指定します。messageStore
- メッセージストア。public void setDelayedAdviceChain(ListSE<Advice> delayedAdviceChain)
List<Advice>
を指定して、DelayHandler.ReleaseMessageHandler
プロキシに通知します。通常、トランザクションメッセージストアから取得した遅延メッセージにトランザクションを追加するために使用されます。delayedAdviceChain
- アドバイスチェーン。createReleaseMessageTask()
public void setDelayedMessageErrorChannel(MessageChannel delayedMessageErrorChannel)
ErrorMessage
が送信されるメッセージチャネルを設定します。エラーフローが正常に戻った場合、リリースは完了です。エラーフローが例外をスローした場合、リリースは再試行されます。リリースタスクに関するトランザクションアドバイスがある場合、エラーフローはトランザクション内で呼び出されます。delayedMessageErrorChannel
- チャンネル。setMaxAttempts(int)
, setRetryDelay(long)
public void setDelayedMessageErrorChannelName(StringSE delayedMessageErrorChannelName)
ErrorMessage
が送信されるメッセージチャネル名を設定します。エラーフローが正常に戻った場合、リリースは完了です。エラーフローが例外をスローした場合、リリースは再試行されます。リリースタスクに関するトランザクションアドバイスがある場合、エラーフローはトランザクション内で呼び出されます。delayedMessageErrorChannelName
- チャンネル名。setMaxAttempts(int)
, setRetryDelay(long)
public void setMaxAttempts(int maxAttempts)
maxAttempts
- 最大試行回数。setRetryDelay(long)
public void setRetryDelay(long retryDelay)
retryDelay
- 再試行遅延。setMaxAttempts(int)
public StringSE getComponentType()
IntegrationObjectSupport
NamedComponent
の getComponentType
MessageHandlerSupport
の getComponentType
public IntegrationPatternType getIntegrationPatternType()
IntegrationPattern
IntegrationPattern
の getIntegrationPatternType
AbstractReplyProducingMessageHandler
の getIntegrationPatternType
IntegrationPatternType
protected void doInit()
AbstractReplyProducingMessageHandler
の doInit
protected boolean shouldCopyRequestHeaders()
AbstractMessageProducingHandler
AbstractMessageProducingHandler
の shouldCopyRequestHeaders
protected ObjectSE handleRequestMessage(Message<?> requestMessage)
releaseMessageAfterDelay(org.springframework.messaging.Message<?>, long)
および DelayHandler.DelayedMessageWrapper
) に遅延されていないかどうかを確認します。次に、'requestMessage' ( determineDelayForMessage(org.springframework.messaging.Message<?>)
) の 'delay' を決定し、delay > 0
が 'delay' の後に 'releaseMessage' タスクをスケジュールするかどうかを決定します。AbstractReplyProducingMessageHandler
の handleRequestMessage
requestMessage
- - 遅延する可能性のあるメッセージ。null
、それ以外の場合は 'requestMessage' からの 'payload'。releaseMessage(org.springframework.messaging.Message<?>)
public int getDelayedMessageCount()
DelayHandlerManagement
の getDelayedMessageCount
public void reschedulePersistedMessages()
messageGroup.getMessages()
の反復処理に基づいており、'delay' ロジックのタスクをスケジュールします。この動作は、呼び出しスレッドのオーバーロードを回避することによって決定されます。DelayHandlerManagement
の reschedulePersistedMessages
public void onApplicationEvent(ContextRefreshedEvent event)
ContextRefreshedEvent
を処理して、アプリケーションコンテキストの起動後にできるだけ遅く reschedulePersistedMessages()
を呼び出すようにします。また、initialized
をチェックして、たとえば Spring-MVC アプリケーションのような ' 親子 ' コンテキストで公開されているかもしれない他の ContextRefreshedEvent
を無視します。ApplicationListener<ContextRefreshedEvent>
の onApplicationEvent
event
- - アプリケーションコンテキストが完全に初期化された後に発生する ContextRefreshedEvent
。reschedulePersistedMessages()