Spring Cloud Stream 3.1函数式生产者测试received为null如何解决?
问题原因
你调用produce方法把消息放入队列后,立刻调用了无参的output.receive(),而Spring Cloud Stream对Supplier类型的函数默认轮询间隔是1000ms(1秒),此时轮询还未触发,消息没有被发送到测试绑定器的输出通道,因此拿到null返回值。
修复方案
- 给
receive方法添加超时时间,等待轮询执行完成:
将测试代码中
Message<byte[]> received = output.receive();
修改为
// 超时时间单位为毫秒,设置2秒足够覆盖默认的1秒轮询间隔 Message<byte[]> received = output.receive(2000);
- (可选)加快测试执行速度
你可以在测试的启动参数中添加轮询间隔配置,把默认的1秒轮询改短,比如修改启动参数为:
.run("--spring.jmx.enabled=false", "--spring.cloud.stream.poller.fixed-delay=100")
设置为100ms轮询一次,测试不需要长时间等待就能拿到结果。
额外排查点
如果修改后还是拿不到消息,可以检查MyMessage类是否实现了序列化接口,有没有JSON序列化相关的异常抛出,消息转换失败也会导致输出通道没有消息。
内容的提问来源于stack exchange,提问作者Vin
相关产品推荐
相关产品推荐

