2015-12-22 107 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()'代替,它工作正常。 –