2015-12-22 42 views
1

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

下面是一个集成的配置

@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 beans。

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

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

回答

0

您应该使用void网关存在,这确实起到了“只发送”组件:

public interface Cafe { 

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

} 

而且在IntegrationFlow应该回复到nullChannel年底你.handle()或少了点从没有任何return方法createIssue()

+0

谢谢,似乎在我的配置中一切都很好。我不应该用调试断点来测试它。我用'sleep()'代替,它工作正常。 –