public class IdempotentReceiverInterceptor extends AbstractHandleMessageAdvice implements org.springframework.beans.factory.BeanFactoryAware
MethodInterceptor
implementation for the
Idempotent Receiver
E.I. Pattern.
This MethodInterceptor
works like a MessageFilter
if discardChannel
is provided or throwExceptionOnRejection
is set to true
.
However if those properties aren't provided, this interceptor will create an new Message
with a IntegrationMessageHeaderAccessor.DUPLICATE_MESSAGE
header when the
requestMessage
isn't accepted by MessageSelector
.
The idempotent filtering
logic depends on the provided MessageSelector
.
This class is designed to be used only for the MessageHandler.handleMessage(org.springframework.messaging.Message<?>)
,
method.
MetadataStoreSelector
,
IdempotentReceiverAutoProxyCreatorInitializer
logger
Constructor and Description |
---|
IdempotentReceiverInterceptor(MessageSelector messageSelector) |
Modifier and Type | Method and Description |
---|---|
protected java.lang.Object |
doInvoke(org.aopalliance.intercept.MethodInvocation invocation,
org.springframework.messaging.Message<?> message) |
protected MessageBuilderFactory |
getMessageBuilderFactory() |
void |
setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory) |
void |
setDiscardChannel(org.springframework.messaging.MessageChannel discardChannel)
Specify a channel where rejected Messages should be sent.
|
void |
setThrowExceptionOnRejection(boolean throwExceptionOnRejection)
Specify whether this interceptor should throw a
MessageRejectedException when its selector does not accept a
Message. |
void |
setTimeout(long timeout)
Specify the timeout value for sending to the discard channel.
|
invoke
public IdempotentReceiverInterceptor(MessageSelector messageSelector)
public void setTimeout(long timeout)
timeout
- the timeout in millisecondspublic void setThrowExceptionOnRejection(boolean throwExceptionOnRejection)
MessageRejectedException
when its selector does not accept a
Message. The default value is false
meaning that rejected
Messages will be discarded or
enriched with IntegrationMessageHeaderAccessor.DUPLICATE_MESSAGE
header and returned as normal to the invocation.proceed()
.
Typically this value would not be true
when
a discard channel is provided, but if it is, it will cause the
exception to be thrown after
the Message is sent to the discard channel,throwExceptionOnRejection
- true if an exception should be thrown.setDiscardChannel(MessageChannel)
public void setDiscardChannel(org.springframework.messaging.MessageChannel discardChannel)
IntegrationMessageHeaderAccessor.DUPLICATE_MESSAGE
header
and returned as normal to the invocation.proceed()
. However,
the 'throwExceptionOnRejection' flag determines whether rejected Messages
trigger an exception. That value is evaluated regardless of the presence
of a discard channel.
If there is needed just silently 'drop' rejected messages configure the
discardChannel
to the nullChannel
.
discardChannel
- The discard channel.setThrowExceptionOnRejection(boolean)
public void setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory) throws org.springframework.beans.BeansException
setBeanFactory
in interface org.springframework.beans.factory.BeanFactoryAware
org.springframework.beans.BeansException
protected MessageBuilderFactory getMessageBuilderFactory()
protected java.lang.Object doInvoke(org.aopalliance.intercept.MethodInvocation invocation, org.springframework.messaging.Message<?> message) throws java.lang.Throwable
doInvoke
in class AbstractHandleMessageAdvice
java.lang.Throwable