Spring Integration DSL非阻塞队列配置

时间:2015-12-22 18:59:55

标签: spring spring-integration

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

这是一个集成配置

@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()方法中设置了一个breapoint,我可以看到控制器没有从它的方法返回,所以触发控制器的外部服务必须等待我的服务完成。 我想要实现的是拥有一个异步处理队列,其中网关只是将消息写入队列并立即返回。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

你应该在那里使用void网关,这真的可以作为一个"只需发送"成分:

public interface Cafe {

    @Gateway(requestChannel="orders")
    void placeOrder(Order order);

}

.handle()末尾的IntegrationFlow应该回复nullChannel,或者只是return方法中没有createIssue()的任何内容。