spring cloud stream多监听方法调度

多监听方法调度
在消费实例方,可以定义多个监听方法对同一通道进行监听处理,但其需要在某些指定的条件下方可触发。恰好@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注解的方法均符合条件,则会被重复消费。

你可能感兴趣的:(spring,cloud)