测试 Spring-Integration 与订阅者通道

Posted

技术标签:

【中文标题】测试 Spring-Integration 与订阅者通道【英文标题】:Testing Spring-Integration with subscriber channel 【发布时间】:2018-06-22 18:54:51 【问题描述】:

我有以下几点:

Direct-Channel => Splitter => PublishSubscribeChannel

我想将数据发送到直接通道并在发布订阅通道中测试结果

到目前为止,我从Spring.io 获得的部分内容(只有在我逐步进入调试模式时才有效)是:

DirectChannel incomeChannel
PublishSubscribeChannel subscribeChannel

@Test
public void test() 
    final AtomicInteger count  = new AtomicInteger()

    assert true == subscribeChannel.subscribe(new MessageHandler() 
        void handleMessage(Message<?> message) throws MessagingException 
            count.getAndIncrement();
            Entity response = message.getPayload()
            assert response != null
            // assertions ...
        
    )

    def request = MessageBuilder.withPayload(entities).build()
    assert incomeChannel.send(request) == true

    Thread.sleep(10000)
    assert 0 < count.get()

【问题讨论】:

【参考方案1】:

你没有显示你的配置,但是,如果你的 pub 子频道有一个任务执行器,你需要添加一个闩锁;您还应该在主线程上进行断言...

@Test
public void test() 
    final AtomicReference<Message<?>> messageRef = new AtomicReference<>();
    final CountDownLatch latch = new CountDownLatch(1);

    assert true == subscriberChannel.subscribe(new MessageHandler() 
        void handleMessage(Message<?> message) throws MessagingException 
            messageRef.set(message);
            latch.countDown();
        
    )

    def request = MessageBuilder.withPayload(entities).build()
    assert incomeChannel.send(request) == true
    assert true == latch.await(10, TimeUnit.SECONDS)
    Entity response = msg.get().getPayload()
    assert response != null
    // assertions ...


【讨论】:

忘记添加latch.await() 断言。 嗨,Gary,非常感谢您的回复,它已经帮了很多忙。但不知何故,我不知何故错过了这个概念。将消息(stubmessage)发送到incomeChannel 需要很长时间才能调用拆分器。您提到了任务执行者,我必须对此做些什么?我将我的代码放入问题中并添加了配置......提前谢谢你 您应该确保您的subscribeChannel 正是subscribe.channel bean 我的意思是 IF 你在通道上有一个任务执行器,那么你的主测试线程必须以某种方式等待任务完成 - 因此是闩锁。如果您没有有执行人,那么我不知道您的测试为什么会失败。请编辑问题以显示您的 COMPLETE 配置。 你是对的,测试有效。在配置中,我添加了使测试无法通过的部分。其实这是配置文件完整的相关xml代码。

以上是关于测试 Spring-Integration 与订阅者通道的主要内容,如果未能解决你的问题,请参考以下文章

Spring Integration Dispatcher 没有频道订阅者

了解spring-integration service-activator

Spring-Integration:将 DirectChannel 更改为 ExecutorChannel 结果为 ClassCastException

在 spring-integration 中使用有效负载类型路由器通过列表通用有效负载路由消息

Spring-Integration Webflux 异常处理

使用spring-integration快速实现mysql分布锁