如何将消息体中的字段添加到@StreamListener的监听条件中
解决方案
你可以直接使用@StreamListener注解自带的condition属性,配合SpEL表达式读取消息体(对应SpEL上下文的payload对象)中的字段,实现按消息内容过滤监听的效果。
示例代码
比如你需要只消费entity.name值为"pay_event"的消息,写法如下:
@StreamListener(value = "你的目标Topic名称", condition = "payload.entity.name == 'pay_event'") public void handleTargetEvent(Event event) { // 仅处理符合过滤条件的消息 }
注意事项
- 你的
Event和Entity实体类必须为所有要用到的字段提供public修饰的getter方法,否则SpEL表达式无法读取字段值,会导致条件判断一直不生效 - 如果要避免空指针异常,可以用SpEL的安全导航运算符
?.来取值,示例:condition = "payload?.entity?.name == 'pay_event'",即使payload或者entity为null也不会抛出异常 - Spring Cloud Stream 1.x 版本的
condition仅支持读取消息头字段,需要升级到2.x及以上版本才能正常读取payload里的内容 - 若过滤逻辑非常复杂,SpEL表达式难以编写,也可以直接在监听方法入口做字段判断,不符合条件直接return即可,只是该方式会让所有消息都进入方法执行,性能比用
condition提前过滤要差
内容的提问来源于stack exchange,提问作者Danzxz
相关产品推荐
相关产品推荐

