2016-05-30 9 views
1

Ich bin neu bei Spring Integration DSL. Derzeit versuche ich eine Verzögerung zwischen den Nachrichtenkanälen "ordersChannel" und "bookItemsChannel" hinzuzufügen. Aber der Fluss setzt sich fort, als gäbe es keine Verzögerung. Jede Hilfe wird geschätzt. Hier ist der Code:Keine Verzögerung beim Senden von Nachrichten zwischen Nachrichtenkanälen

@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(); 
} 

Antwort

1

scheint mir, dass die init Phase gemischt, wenn Sie sehen, dass System.out.println("Going to delay"); und die wirkliche Laufzeit, wenn die Verzögerung für jede eingehende Nachricht geschieht.

Wir haben eine gewisse Verzögerung Testfall im DSL-Projekt, aber ich habe gerade geschrieben habe, dieses zu beweisen, dass die defaultDelay funktioniert gut:

@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)); 
} 

Wie Sie es ist sehr nah an der config zu sehen, aber es beweist nicht, dass wir etwas falsch haben um .delay().

So wäre es besser, etwas ähnliches zur Verfügung zu stellen, um ein unerwartetes Problem zu bestätigen.

+0

Ja. Du hast recht. Die Verzögerung funktioniert wie erwartet. Mein Frühlingskontext wurde geschlossen, bevor die Verzögerung tatsächlich passierte. – ShankaraNarayanan

Verwandte Themen