小编典典

Spring Integration通过控制总线手动启动/停止通道适配器

spring

无论如何,是否有手动启动/初始化通道适配器?

我的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发送

我在运行时决定要应用什么设置。

那么,你能告诉我这套控制总线到底如何适合吗?


阅读 342

收藏
2020-04-21

共1个答案

小编典典

设置autoStartup="false"和直接start()/ stop()它们,或使用<control-bus/>(发送@myAdapter.start())。

获取直接参考(自动装配等)取决于端点类型。如果是轮询的端点,请插入SourcePollingChannelAdapter;。消息驱动的适配器有所不同,但通常为MessageProducerSupportMessagingGatewaySupport

编辑:

在此处了解有关控制总线的信息。

给入站适配器一个id属性。

<control-bus input-channel="control"/>

<int:gateway service-interface="foo.Controller" default-request-channel="control"/>

创建一个网关接口

public interface Controller {

    void control(String command);

}

@Autowire网关(或使用context.getBean(Controller.class))。

然后,当你准备启动适配器时,请调用gateway.control(“@mqttOut.start()”)。

你不需要auto-startup="false"出站适配器。

但是,对于像这样的简单用例,你可能想研究使用Spring配置文件(将适配器放入配置文件中并在运行时启用配置文件。

2020-04-21