S
- the propagated state object type.public abstract class ThreadStatePropagationChannelInterceptor<S>
extends java.lang.Object
implements org.springframework.messaging.support.ChannelInterceptor, 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.
Constructor and Description |
---|
ThreadStatePropagationChannelInterceptor() |
Modifier and Type | Method and 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) |
public ThreadStatePropagationChannelInterceptor()
public final org.springframework.messaging.Message<?> preSend(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
preSend
in interface org.springframework.messaging.support.ChannelInterceptor
public final org.springframework.messaging.Message<?> postReceive(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel)
postReceive
in interface org.springframework.messaging.support.ChannelInterceptor
public final org.springframework.messaging.Message<?> beforeHandle(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel, org.springframework.messaging.MessageHandler handler)
beforeHandle
in interface org.springframework.messaging.support.ExecutorChannelInterceptor
public void afterMessageHandled(org.springframework.messaging.Message<?> message, org.springframework.messaging.MessageChannel channel, org.springframework.messaging.MessageHandler handler, java.lang.Exception ex)
afterMessageHandled
in interface org.springframework.messaging.support.ExecutorChannelInterceptor
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)