2016-05-30 2 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

Смежные вопросы