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

标签 java spring spring-integration

有没有办法手动启动/初始化 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 ;消息驱动的适配器各不相同,但通常是 MessageProducerSupportMessagingGatewaySupport .

编辑:

了解 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/

相关文章:

java - Spring PollableChannel - 无法将loggingEnabled设置为false?

java - 超时动态 HTTP 出站网关请求工厂

java - Spring Data JPA 查询

CSS双类属性的Java正则表达式匹配

java - 无法检索 blob 数据并在 JLabel-mySql 中显示

java - 如何为 HTML 简单文本制作正则表达式模式?

java - 从 Clover 代码覆盖率中全局排除所有 Spring JavaConfig

spring - 为什么 spring 集成中默认的 "errorChannel"是 "PublishSubscribeChannel"?

java - 轮询字段中的空值时删除

java - 使用 CompletableFuture 检查异常