【问题标题】:No delay happening when sending messages between message channels在消息通道之间发送消息时不会发生延迟
【发布时间】:2016-09-28 07:40:51
【问题描述】:

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

【问题讨论】:

    标签: spring spring-integration dsl


    【解决方案1】:

    在我看来,当您看到 System.out.println("Going to delay"); 和实际运行时(每个传入消息都发生延迟时)混合了 init 阶段。

    我们在 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() 周围有问题。

    因此,最好提供类似的内容来确认意外问题。

    【讨论】:

    • 是的。你说的对。延迟按预期工作。在延迟实际发生之前,我的 spring 上下文已经关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多