Class IdempotentReceiverInterceptor

All Implemented Interfaces:
Advice, Interceptor, MethodInterceptor, Aware, BeanFactoryAware, BeanNameAware, InitializingBean, ApplicationContextAware, ComponentSourceAware, ExpressionCapable, HandleMessageAdvice, NamedComponent

public class IdempotentReceiverInterceptor extends AbstractHandleMessageAdvice
The 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 a 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(Message) method.

Since:
4.1
Author:
Artem Bilan, Gary Russell
See Also:
  • Constructor Details

    • IdempotentReceiverInterceptor

      public IdempotentReceiverInterceptor(MessageSelector messageSelector)
  • Method Details

    • setTimeout

      public void setTimeout(long timeout)
      Specify the timeout value for sending to the discard channel.
      Parameters:
      timeout - the timeout in milliseconds
    • setThrowExceptionOnRejection

      public void setThrowExceptionOnRejection(boolean throwExceptionOnRejection)
      Specify whether this interceptor should throw a 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,
      Parameters:
      throwExceptionOnRejection - true if an exception should be thrown.
      See Also:
    • setDiscardChannel

      public void setDiscardChannel(MessageChannel discardChannel)
      Specify a channel where rejected Messages should be sent. If the discard channel is null (the default), duplicate Messages will be enriched with 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.

      Parameters:
      discardChannel - The discard channel.
      See Also:
    • setDiscardChannelName

      public void setDiscardChannelName(String discardChannelName)
      Specify a channel name where rejected Messages should be sent. If the discard channel is null (the default), duplicate Messages will be enriched with 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.

      Only applies if a discardChannel is not provided.

      Parameters:
      discardChannelName - The discard channel name.
      Since:
      5.0.1
      See Also:
    • getComponentType

      public String getComponentType()
    • doInvoke

      protected @Nullable Object doInvoke(MethodInvocation invocation, Message<?> message) throws Throwable
      Specified by:
      doInvoke in class AbstractHandleMessageAdvice
      Throws:
      Throwable