测试 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 中使用有效负载类型路由器通过列表通用有效负载路由消息