2016-05-30 147 views
1

我是Spring Integration DSL的新手。目前,我試圖在消息通道「ordersChannel」和「bookItemsChannel」之間添加一個延遲 。但是,流程繼續,好像沒有延遲。 任何幫助表示讚賞。 下面是代碼:在消息通道之間發送消息時沒有延遲發生

@Bean 
public IntegrationFlow ordersFlow() { 
    return IntegrationFlows.from("ordersChannel") 
      .split(new AbstractMessageSplitter() { 

       @Override 
       protected Object splitMessage(Message<?> message) { 

        return ((Order)message.getPayload()).getOrderItems(); 
       } 
      }) 
      .delay("normalMessage", new Consumer<DelayerEndpointSpec>() { 

       public void accept(DelayerEndpointSpec spec) { 
        spec.id("delayChannel"); 
        spec.defaultDelay(50000000); 
        System.out.println("Going to delay"); 
       } 
      }) 
      .channel("bookItemsChannel") 
      .get(); 
} 

回答

1

似乎對我說,混合init階段,當你看到System.out.println("Going to delay");和實際運行時,當延遲會爲每個傳入消息。

我們在DSL項目的一些延遲測試案例,但我只是寫了這一個證明defaultDelay效果很好:正如你看到它是非常接近你的配置

@Bean 
public IntegrationFlow ordersFlow() { 
    return f -> f 
      .split() 
      .delay("normalMessage", (DelayerEndpointSpec e) -> e.defaultDelay(5000)) 
      .channel(c -> c.queue("bookItemsChannel")); 
} 

... 

@Autowired 
@Qualifier("ordersFlow.input") 
private MessageChannel ordersFlowInput; 

@Autowired 
@Qualifier("bookItemsChannel") 
private PollableChannel bookItemsChannel; 

@Test 
public void ordersDelayTests() { 
    this.ordersFlowInput.send(new GenericMessage<>(new String[] {"foo", "bar", "baz"})); 

    StopWatch stopWatch = new StopWatch(); 
    stopWatch.start(); 
    Message<?> receive = this.bookItemsChannel.receive(10000); 
    assertNotNull(receive); 

    receive = this.bookItemsChannel.receive(10000); 
    assertNotNull(receive); 

    receive = this.bookItemsChannel.receive(10000); 
    assertNotNull(receive); 
    stopWatch.stop(); 

    assertThat(stopWatch.getTotalTimeMillis(), greaterThanOrEqualTo(5000L)); 
} 

,但它並不能證明我們在.delay()附近有什麼錯誤。

因此,最好是提供類似的東西來確認意外問題。

+0

是的。你是對的。延遲按預期工作。實際發生延遲之前,我的春天情況已經關閉了。 – ShankaraNarayanan