Class ThreadStatePropagationChannelInterceptor<S>
- Type Parameters:
S
- the propagated state object type.
- All Implemented Interfaces:
org.springframework.messaging.support.ChannelInterceptor
,org.springframework.messaging.support.ExecutorChannelInterceptor
public abstract class ThreadStatePropagationChannelInterceptor<S>
extends java.lang.Object
implements org.springframework.messaging.support.ExecutorChannelInterceptor
ExecutorChannelInterceptor
implementation responsible for
the Thread
(any?) state propagation from one message flow's thread to another
through the MessageChannel
s involved in the flow.
The propagation is done from the preSend(Message, MessageChannel)
implementation using some internal Message
extension which keeps the message
to send and the state to propagate.
The propagated state context extraction and population is done from the postReceive(org.springframework.messaging.Message<?>, org.springframework.messaging.MessageChannel)
implementation for the PollableChannel
s, and from
the beforeHandle(org.springframework.messaging.Message<?>, org.springframework.messaging.MessageChannel, org.springframework.messaging.MessageHandler)
for the
AbstractExecutorChannel
s and
ExecutorSubscribableChannel
s
Important. Any further interceptor, which modifies the message to send
(e.g. MessageBuilder.withPayload(...)...build()
), may drop the state to propagate.
Such kind of interceptors combination should be revised properly.
In most cases the interceptors reordering is enough to overcome the issue.
- Since:
- 4.2
-
Constructor Summary
Constructors Constructor Description ThreadStatePropagationChannelInterceptor()
-
Method Summary
Modifier and Type Method Description void
afterMessageHandled(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel, org.springframework.messaging.MessageHandler handler, java.lang.Exception ex)
org.springframework.messaging.Message<?>
beforeHandle(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel, org.springframework.messaging.MessageHandler handler)
protected abstract S
obtainPropagatingContext(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
protected abstract void
populatePropagatedContext(S state, org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
org.springframework.messaging.Message<?>
postReceive(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
org.springframework.messaging.Message<?>
preSend(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
-
Constructor Details
-
ThreadStatePropagationChannelInterceptor
public ThreadStatePropagationChannelInterceptor()
-
-
Method Details
-
preSend
public final org.springframework.messaging.Message<?> preSend(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)- Specified by:
preSend
in interfaceorg.springframework.messaging.support.ChannelInterceptor
-
postReceive
public final org.springframework.messaging.Message<?> postReceive(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)- Specified by:
postReceive
in interfaceorg.springframework.messaging.support.ChannelInterceptor
-
beforeHandle
public final org.springframework.messaging.Message<?> beforeHandle(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel, org.springframework.messaging.MessageHandler handler)- Specified by:
beforeHandle
in interfaceorg.springframework.messaging.support.ExecutorChannelInterceptor
-
afterMessageHandled
public void afterMessageHandled(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel, org.springframework.messaging.MessageHandler handler, java.lang.Exception ex)- Specified by:
afterMessageHandled
in interfaceorg.springframework.messaging.support.ExecutorChannelInterceptor
-
obtainPropagatingContext
protected abstract S obtainPropagatingContext(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel) -
populatePropagatedContext
protected abstract void populatePropagatedContext(S state, org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
-