Spring Integration XML配置下覆盖inbound channel adapter方法咨询
问题解答
可以在XML配置中覆盖Spring Integration的相关元素,你遇到两个端点同时启动的核心原因是两个适配器被作为独立bean注册,没有触发bean覆盖逻辑,也没有通过profile做互斥限制。
方案一:互斥profile绑定(推荐)
这是最稳妥的实现方式,不会涉及bean覆盖的优先级问题:
- 给两个
inbound-channel-adapter指定完全相同的id属性 - 分别给两个适配器套上互斥的
<beans profile="">标签,确保同一时间只有一个适配器会被注册到上下文
示例配置:
<!-- 非文件环境启用JMS适配器 --> <beans profile="!file"> <int-jms:inbound-channel-adapter id="inputInboundAdapter" destination="jmsInputQueue" channel="businessProcessChannel"> <int:poller fixed-delay="1000"/> </int-jms:inbound-channel-adapter> </beans> <!-- 文件环境启用File适配器 --> <beans profile="file"> <int-file:inbound-channel-adapter id="inputInboundAdapter" directory="/data/input" channel="businessProcessChannel"> <int:poller fixed-delay="1000"/> </int-file:inbound-channel-adapter> </beans>
启动时指定spring.profiles.active=file即可切换到文件适配器,不指定该profile则默认启用JMS适配器。
方案二:Bean定义覆盖(适合无法拆分profile的场景)
如果你的配置结构不允许拆分互斥profile,需要通过后续导入覆盖原有bean,需满足以下所有条件:
- 原有JMS适配器和后续导入的File适配器必须使用完全相同的
id - 开启Spring的bean覆盖开关:Spring Boot场景启动时添加参数
spring.main.allow-bean-definition-overriding=true;传统Spring场景需给DefaultListableBeanFactory设置allowBeanDefinitionOverriding属性为true - 基于profile的导入语句必须放在基础JMS配置的下方,Spring后加载的同id bean会自动覆盖先加载的定义
内容的提问来源于stack exchange,提问作者Kamil Roman
相关产品推荐
相关产品推荐

