Spring Cloud Stream同一通道根据消息内容分发不同的消费逻辑

企业动态
有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑。

 应用场景

有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑,其代码结构可能是这样的:

[[254734]]

  1. @StreamListener(value = TestTopic.INPUT) 
  2. public void receiveV1(String payload, @Header("version") String version) { 
  3.     if("1.0".equals(version)) { 
  4.         // Version 1.0 
  5.     } 
  6.     if("2.0".equals(version)) { 
  7.         // Version 2.0 
  8.     } 

那么当消息处理逻辑复杂的时候,这段逻辑就会变得特别复杂。针对这个问题,在@StreamListener注解中提供了一个不错的属性condition,可以用来优化这样的处理结构。

动手试试

下面通过编写一个简单的例子来具体体会一下这个属性的用法:

  1. @EnableBinding(TestApplication.TestTopic.class) 
  2. @SpringBootApplication 
  3. public class TestApplication { 
  4.  
  5.     public static void main(String[] args) { 
  6.         SpringApplication.run(TestApplication.class, args); 
  7.     } 
  8.  
  9.     @RestController 
  10.     static class TestController { 
  11.  
  12.         @Autowired 
  13.         private TestTopic testTopic; 
  14.  
  15.         /** 
  16.          * 消息生产接口 
  17.          * 
  18.          * @param message 
  19.          * @return 
  20.          */ 
  21.         @GetMapping("/sendMessage"
  22.         public String messageWithMQ(@RequestParam String message) { 
  23.             testTopic.output().send(MessageBuilder.withPayload(message).setHeader("version""1.0").build()); 
  24.             testTopic.output().send(MessageBuilder.withPayload(message).setHeader("version""2.0").build()); 
  25.             return "ok"
  26.         } 
  27.  
  28.     } 
  29.  
  30.     /** 
  31.      * 消息消费逻辑 
  32.      */ 
  33.     @Slf4j 
  34.     @Component 
  35.     static class TestListener { 
  36.  
  37.         @StreamListener(value = TestTopic.INPUT, condition = "headers['version']=='1.0'"
  38.         public void receiveV1(String payload, @Header("version") String version) { 
  39.             log.info("Received v1 : " + payload + ", " + version); 
  40.         } 
  41.  
  42.         @StreamListener(value = TestTopic.INPUT, condition = "headers['version']=='2.0'"
  43.         public void receiveV2(String payload, @Header("version") String version) { 
  44.             log.info("Received v2 : " + payload + ", " + version); 
  45.         } 
  46.  
  47.     } 
  48.  
  49.     interface TestTopic { 
  50.  
  51.         String OUTPUT = "example-topic-output"
  52.         String INPUT = "example-topic-input"
  53.  
  54.         @Output(OUTPUT
  55.         MessageChannel output(); 
  56.  
  57.         @Input(INPUT) 
  58.         SubscribableChannel input(); 
  59.  
  60.     } 
  61.  

内容很简单,既包含了消息的生产,也包含了消息消费。在/sendMessage接口的定义中,发送了两条消息,一条消息的头信息中包含version=1.0,另外一条消息的头信息中包含version=2.0。在消息监听类TestListener中,对TestTopic.INPUT通道定义了两个@StreamListener,这两个监听逻辑有不同的condition,这里的表达式表示会根据消息头信息中的version值来做不同的处理逻辑分发。

在启动应用之前,还要记得配置一下输入输出通道对应的物理目标(exchange或topic名),比如:

  1. spring.cloud.stream.bindings.example-topic-input.destination=test-topic 
  2. spring.cloud.stream.bindings.example-topic-input.group=stream-content-route 
  3. spring.cloud.stream.bindings.example-topic-output.destination=test-topic 

完成了上面配置之后,就可以启动应用,并尝试访问localhost:8080/sendMessage?message=hello接口来发送一个消息到MQ中了。此时可以看到类似下面的日志:

  1. 2018-12-24 15:50:33.361  INFO 17683 --- [content-route-1] c.d.stream.TestApplication$TestListener  : Received v1 : hello, 1.0 
  2. 2018-12-24 15:50:33.363  INFO 17683 --- [content-route-1] c.d.stream.TestApplication$TestListener  : Received v2 : hello, 2.0 

从日志中可以看到,两条带有不同头信息的消息,分别通过不同的监听处理逻辑输出了对应的日志打印。

代码示例

本文示例读者可以通过查看下面仓库的中的stream-content-route项目:

Github

Gitee

【本文为51CTO专栏作者“翟永超”的原创稿件,转载请通过51CTO联系作者获取授权】

 

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2010-05-21 12:32:13

统一通信技术平台

2010-05-12 15:12:47

统一通信服务

2021-01-07 07:40:31

驱动微服务消息

2019-02-25 15:44:16

开源RabbitMQSpring Clou

2010-05-12 17:56:10

2012-10-18 13:48:31

统一通信UC

2010-05-19 15:42:08

2010-05-17 14:53:00

统一通信系统平台

2010-05-24 10:53:48

2010-09-07 16:34:31

统一通信sip

2010-05-14 16:39:47

移动统一通信

2011-08-10 10:16:12

IPv6IPv4思科

2021-05-17 16:24:58

Spring Clou

2023-10-12 22:25:04

微服务Spring

2010-05-13 11:23:46

统一通信平台

2010-05-17 14:50:34

移动统一通信

2010-05-17 14:42:41

移动统一通信

2010-05-13 23:39:47

统一通信市场

2010-05-14 15:05:02

统一通信工具

2010-05-12 15:05:43

点赞
收藏

51CTO技术栈公众号