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

时间:2014-05-28 15:14:21

标签: java spring spring-integration

是否有手动启动/初始化通道适配器?

我的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消息 - &gt;写入文件
2.发布者案例:从目录中轮询文件 - &gt;通过mqtt发送

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

那么请你告诉我这个控制总线的东西究竟适合这个吗?

3 个答案:

答案 0 :(得分:15)

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

获取直接引用(autowire等)取决于端点类型。如果是轮询端点,请注入SourcePollingChannelAdapter;消息驱动的适配器各不相同,但通常是MessageProducerSupportMessagingGatewaySupport

编辑:

了解control-bus here

为入站适配器提供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配置文件进行调查(将适配器放在配置文件中并在运行时启用配置文件。

答案 1 :(得分:3)

要实现此目的,您需要先将通道适配器自动启动属性设置为false auto-startup="false",然后使用控制总线启动/停止适配器

请参阅此处控制总线示例 - https://github.com/spring-projects/spring-integration-samples/tree/master/basic/control-bus

答案 2 :(得分:1)

我正在寻找使用Spring集成Java DSL的相同示例,但没有找到任何东西,所以我创建了自己的。它显示配置非常简单。

@Bean
public IntegrationFlow controlBus() {
    return IntegrationFlows.from(controlChannel())
            .controlBus()
            .get();
}

@Bean
public MessageChannel controlChannel() {
    return MessageChannels.direct().get();
}

停止它:

controlChannel.send(new GenericMessage<>("@myInboundAdapter.stop()"));

https://github.com/CauchyPeano/sftp-poller-control-bus