【问题标题】:Spring integration ServiceActivator autostartup flagSpring集成ServiceActivator自动启动标志
【发布时间】:2019-05-23 01:07:46
【问题描述】:

我有一个带有 ServiceActivator 注释方法的 Spring Boot 应用程序,用于从队列中读取消息对象。类似的东西:

@EnableBinding(Sink.class)
public class MyProcessor {
    @ServiceActivator(inputChannel = Sink.INPUT)
    public void process(final Message<?> message) {
       // ...
    }
}

但是,现在我需要加载用户脚本并使用它来预处理消息的有效负载。此加载可能会失败或脚本可能无法编译。如果发生这种情况,我不想启动我的接收器,而只是将消息留在队列中,直到问题得到解决并重新启动应用程序。

ServiceActivator 有一个 autostartup 属性,所以似乎我可以将其设置为 false,然后当我对脚本没问题感到满意时手动启动接收器。但是,我不知道如何或何时进行手动启动。

【问题讨论】:

    标签: spring-integration spring-cloud-stream


    【解决方案1】:

    这更像是一个 Spring Cloud Stream 问题。这就是为什么我在您的问题中添加了相应的标签。

    因此,在您的脚本达到良好状态之前,您真的不能开始使用消息传递中间件。出于这个原因,@ServiceActivator 已经太晚了。队列中的消费已经开始了。

    我的意思是真的没有那个绑定要启动。您可以使用绑定消费者属性来做到这一点:https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/2.2.0.RELEASE/spring-cloud-stream.html#_consumer_properties

    自动启动

    如果这个消费者需要自动启动的信号

    默认值:true

    您可以稍后通过Binding.start() 处理它。

    【讨论】:

    • 我运气不好。我在 application.yml 中设置:“spring.cloud.stream.input.consumer.autoStartup=false”。 (我还尝试了“spring.cloud.stream.default.consumer.autoStartup=false”,因为我不清楚哪个是正确的。)两者都没有任何明显的效果。 process() 方法仍然像往常一样触发和处理消息。设置注释 @ServiceActivator(inputChannel = Sink.INPUT, autoStartup = "false") 停止了 process() 方法的运行,但我得到了一个错误:“调度程序没有订阅者”。该消息仍从输入队列中删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2021-01-08
    相关资源
    最近更新 更多