有没有办法手动启动/初始化 channel 适配器?
我的 context.xml 中有两对入站/出站适配器,我想在运行时决定我要启动其中的哪一个。
编辑:
具体场景:
我有一个客户端,可以在运行时将其配置为 mqtt 发布者或订阅者。
我的 context.xml 如下所示:
<int-mqtt:message-driven-channel-adapter
client-id="foo"
auto-startup="true"
url="tcp://192.168.97.164:1883"
topics="testtopic/#"
channel="writeToFile" />
<file:outbound-channel-adapter
id="writeToFile"
auto-startup="true"
directory="./test/out"
delete-source-files="false"/>
<int:transformer id="Transformer"
ref="MessageTransformer"
input-channel="readFromFile"
output-channel="mqttOut"
method="bytesFromFile" />
<bean id="MessageTransformer" class="MessageTransformer"/>
<int-mqtt:outbound-channel-adapter
id="mqttOut"
client-id="foo"
url="tcp://192.168.97.164:1883"
auto-startup="false"
default-qos="1"
default-retained="true"
default-topic="testtopic/bla"
/>
<file:inbound-channel-adapter
auto-startup="false"
id="readFromFile"
directory="./test/in"
filename-pattern="myFile*">
<int:poller id="poller"
fixed-rate="5000" />
</file:inbound-channel-adapter>
如你所见,我有两个设置:
1、订阅者案例:读取mqtt消息->写入文件
2.发布者案例:从目录中轮询一个文件->通过mqtt发送
我在运行时决定应用什么设置。
那么你能告诉我这个控制总线的东西如何适合这里吗?
最佳答案
设置autoStartup="false"
或者直接start()
/stop()
他们,或使用 <control-bus/>
(发送 @myAdapter.start()
)。
获取直接引用( Autowiring 等)取决于端点类型。如果它是轮询端点,则注入(inject) SourcePollingChannelAdapter
;消息驱动的适配器各不相同,但通常是 MessageProducerSupport
或 MessagingGatewaySupport
.
编辑:
了解 control-bus here .
给入站适配器一个id
属性。
添加<control-bus input-channel="control"/>
添加<int:gateway service-interface="foo.Controller" default-request-channel="control"/>
创建网关接口(interface)
public interface Controller {
void control(String command);
}
@Autowire
网关(或使用 context.getBean(Controller.class)
)。
然后,当您准备好启动适配器时,调用,例如gateway.control("@mqttOut.start()")
.
你不需要auto-startup="false"
在出站适配器上。
但是,对于像这样的简单用例,您可能想要研究使用 Spring 配置文件(将适配器放在配置文件中并在运行时启用配置文件。
关于java - Spring Integration 通过控制总线手动启动/停止 channel 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23915524/