【问题标题】:Spring Integration DSL non-blocking queue configurationSpring Integration DSL 非阻塞队列配置
【发布时间】:2015-12-22 18:59:54
【问题描述】:

我正在尝试设置一个集成流,其中输入通道是一个可以充当非阻塞队列的队列。我现在看到的是,如果我从 Spring MVC 控制器触发消息处理,如果消息处理需要时间,控制器将不会返回并等待消息处理程序(服务激活器)完成。

这是一个集成配置

@Bean(name = "createIssue.input")
MessageChannel queueInput() {
    return MessageChannels.queue(10)
            .get();
}

@Bean(name = PollerMetadata.DEFAULT_POLLER)
PollerMetadata poller() {
    return Pollers.fixedRate(100)
            .maxMessagesPerPoll(1)
            .get();
}

@Bean
IntegrationFlow createIssue() {
    return IntegrationFlows.from(queueInput())
            .split()
            .transform(mytransformer, "convert")
            .handle(myservice, "createIssue")
            .get();
}

myservicemytransformer 只是普通的 Spring bean。

我有一个 Spring MVC REST 控制器,它使用其 GET 处理程序之一中的网关写入 createIssue.input 队列。

如果我在myservice.createIssue() 方法中设置了一个断点,我可以看到控制器不会从它的方法返回,因此触发控制器的外部服务必须等待我的服务完成。 我想要实现的是拥有一个异步处理队列,其中网关只需将消息写入队列并立即返回。我怎样才能做到这一点?

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    您应该在那里使用void Gateway,它实际上充当“仅发送”组件:

    public interface Cafe {
    
        @Gateway(requestChannel="orders")
        void placeOrder(Order order);
    
    }
    

    您在IntegrationFlow 末尾的.handle() 应该回复nullChannel,或者只是不回复return 来自createIssue() 方法的任何内容。

    【讨论】:

    • 谢谢,我的配置似乎一切正常。我不应该用调试断点来测试它。我用sleep() 代替,它工作正常。
    • 这正是我所需要的,“空白”,谢谢!