6. Spring Cloud Stream Channel初始化与Binder绑定及使用上的一些坑
2021-04-09 23:52:03 0 举报
SpringCloudStream Channel初始化并与Binder进行绑定的简要描述,并总结其中可能出现的一些坑
作者其他创作
大纲/内容
通道创建工厂
EnableBindingspan style=\"font-size: inherit;\
BinderFactoryAutoConfiguration-> SubscribableChannelBindingTargetFactory该工厂用于创建Input Output通道
调用实际的binder实现进行绑定
AbstractBindingLifecycle.start()-> bindable.createAndBindInputs传入BindingService进行Channel和Binder的绑定
use
那么当我们想要绕过EnableBinding扫描接口的方式直接初始化Channel该怎么实现呢?1. 首先我们仍然需要将EnableBinding注解上自动加载的东西进行加载,因为需要用到创建好的ChannelFactory;2. 将Channel的Bean定义注入BeanFactory,对于Bean定义我们可以通过某个Bean的工厂方法的方式创建,这里可以提供一个工厂Bean(不一定非要FactoryBean)去创建我们的Channel,当然这个Bean本身需要依赖SubscribableChannelBindingTargetFactory;3. 此时Channel创建好了,但是Channel与Binder并未发生绑定关系,此时可以有两种方式去绑定关系: 1) 通过BindService进行绑定 2) 通过实现Bindable,将我们的Bean注入BeanFactory,此时CloudStream会扫描到我们的Bindable,FinishRefresh阶段会调用生命周期函数进行关系绑定,通过这种方式可以设置生命周期回调管理我们的Channel绑定;4. 注意1:从这里可以看到,Channel会提前创建好,但是Channel与Binder的绑定关系是在容器刷新结束才进行的绑定,那么若在InitializeBean中想要调用Channel发送消息则会报错,即当前没有监听节点(实际因为未绑定);5. 注意2:由于Spring容器加载是单线程的,在binder初始化时若消息中间件连接不上时会导致无限重连,此时会阻塞线程,导致Tomcat的IO处理线程无法开启bind(),导致此时无法接收HTTP请求
Bean注册
binder.bindConsumer
对每个Binding内的接口Class创建代理对象,通过工程Bean的getObject返回接口的代理对象并将接口Class扫描到的输入输出通道的创建方式设为该接口Class相应的通道获取方法;在该代理对象初始化完毕时,创建相应的通道对象;在调用该代理对象获取通道时,保存method -> 通道对象的映射关系。
BindingService.doBindConsumer
0 条评论
下一页