本文是自己的学习笔记,主要参考资料如下:
通道的基础抽象类是MessageChannel
,定义的接口方法非常简单,只有两个,都是关于发送的,如下所示。
public interface MessageChannel {
boolean send(Message message);
boolean send(Message message, long timeout);
}
方法的意义很简单不多解释。只要知道,如果发送成功,返回true;因为各种原因发送失败,返回false
。
因为Integration中,支持点对点』(point-to-point)和『订阅-发布』(publish-subscribe)两种模式(具体看下面的链接),这两种模式接受信息的方式不一样,所以MessageChannel
中只定义了发送信息的方法,接受信息的方法则放到其子类中定义。
PollableChannel``继承
MessageChannel```,代码如下
public interface PollableChannel extends MessageChannel {
/* return null if something is wrong, so is the next method. */
Message<?> receive();
Message<?> receive(long timeout);
}
当有信息发送到PollableChannel通道时,通道需要主动调用receive
方法接受信息。在这一过程中信息必然要在通道中缓存一段时间,所以PollableChannel
是支持缓存的。而下面的SubscribableChannel
,它订阅的节点一发信息过来,它就得立刻接受并处理,中间没有余地来缓存。
SubscribableChannel
也继承MessageChannel
,代码如下
public interface SubscribableChannel extends MessageChannel {
boolean subscribe(MessageHandler handler);
boolean unsubscribe(MessageHandler handler);
}
这种订阅发布模式的通道会直接关联上一个MessageHandler
的实例。当这个messageHandler发送信息时,会直接发送到对应的订阅者上,所以SubscribableChannel
不需要提供缓存的功能。
通道的基本架构就是上面的内容,而通道的实现类都是在上面的架构之中。那些实现类的具体内容等以后有时间再写吧。
下面是使用XML配置创建一个最简单的通道实例
<int:channel id="exampleChannel"/>
这个方法创建的实例类型是DirectChannel
,等价于下面的Java代码
@Bean
public MessageChannel exampleChannel() {
return new DirectChannel();
}
DirectChannel
是『点对点』(point-to-point)类型的通道,如果想要创建『发布-订阅』类型的通道则要用下面的方式定义
<int:publish-subscribe-channel id="exampleChannel"/>
这个创建了一个PublishSubscribeChannel
等同于下面的Java代码
@Bean
public MessageChannel exampleChannel() {
return new PublishSubscribeChannel();
}
以上是创建简单的通道bean的方法。其他类型的通道,比如QueueChannel
和PriorityChannel
等创建方法以后有时间再写。
从名字上就能看出,该通道既可以作发布者,也可以作订阅者。它从它订阅的Channel获取信息,然后将信息传给订阅它的其他节点。
PublishSubscribeChannel
只是继承了SubscribableChannel
,并没有继承PollableChannel
,所以PublishSubscribeChannel
并不提供缓存的功能。
PublishSubscribeChannel
实例s订阅的节点p发布信息时,s必须立刻接收信息并处理。不存在p发布信息后,s过一段时间再自己去拿的情况