多监听方法调度
在消费实例方,可以定义多个监听方法对同一通道进行监听处理,但其需要在某些指定的条件下方可触发。恰好@StreamListener注解提供了condition参数作为条件设定,其支持SpEL表达式,通过条件约束即可满足我们的需求。具体示例如下:
1、添加如下两个监听方法,其中userReceiveByHeader1方法监听头信息中flag为aa的消息,userReceiveByHeader2方法监听头信息中flag为bb的消息:
/*********************************实现多个监听者应用******************************/
@StreamListener(value = MySink.USER_CHANNEL, condition = "headers['flag']=='aa'")
public void userReceiveByHeader1(@Payload User user) {
LOGGER.info("Received from {} channel : {} with head (flag:aa)", MySink.USER_CHANNEL, user.getUsername());
}
@StreamListener(value = MySink.USER_CHANNEL, condition = "headers['flag']=='bb'")
public void userReceiveByHeader2(@Payload User user) {
LOGGER.info("Received from {} channel : {} with head (flag:bb)", MySink.USER_CHANNEL, user.getUsername());
}
2、在单元测试消息发送时添加flag头信息,如下值aa:
@Test
public void myUserSenderTester() {
User user = new User().setUsername("shuaishuai").setAge(12);
userSender.userChannelSender().send(MessageBuilder.withPayload(ReflectionToStringBuilder.toString(user, ToStringStyle.JSON_STYLE))
.setHeader("name", "song")
.setHeader("flag","aa")
.build());
}
3、执行单元测试打印如下:
Received from {} channel : {} with head (flag:aa)
4、继续修改单元测试,设置flag值为bb:
@Test
public void myUserSenderTester() {
User user = new User().setUsername("shuaishuai").setAge(12);
userSender.userChannelSender().send(MessageBuilder.withPayload(ReflectionToStringBuilder.toString(user, ToStringStyle.JSON_STYLE))
.setHeader("name", "song")
.setHeader("flag","bb")
.build());
}
5、执行单元测试打印如下:
Received from {} channel : {} with head (flag:bb)
小节:在某些指定场景下,通过condition参数能够实现多个监听器在不同条件对监听通道的更多选择性处理。如果多个@StreamListener注解的方法均符合条件,则会被重复消费。