While the Message
plays the crucial role of encapsulating data, it is the
MessageChannel
that decouples message producers from message consumers.
Spring Integration's MessageChannel
interface is defined as follows.
public interface MessageChannel { String getName(); void setName(String name); DispatcherPolicy getDispatcherPolicy(); boolean send(Message message); boolean send(Message message, long timeout); Message receive(); Message receive(long timeout); List<Message<?>> clear(); List<Message<?>> purge(MessageSelector selector); }
When sending a message, the return value will be true if the message is sent successfully.
If the send call times out or is interrupted, then it will return false. Likewise when
receiving a message, the return value will be null in the case of a timeout or interrupt.
The SimpleChannel
implementation wraps a queue. It provides a no-argument constructor as
well as a constructor that accepts the queue capacity:
public SimpleChannel(int capacity)
Specifying a capacity of 0 will create a "direct-handoff" channel where a sender will block until the channel's
receive()
method is called. Otherwise a channel that has not reached its capacity limit
will store messages in its internal queue, and the send()
method will return immediately
even if no receiver is ready to handle the message.
Whereas the SimpleChannel
enforces first-in/first-out (FIFO) ordering, the
PriorityChannel
is an alternative implementation that allows for messages to be ordered
within the channel based upon a priority. By default the priority is determined by the
'priority
' property within each message's header. However, for custom priority determination
logic, a comparator of type Comparator<Message<?>>
can be provided to the
PriorityChannel
's constructor.