当前位置:   article > 正文

SpringBoot集成Redis消息订阅发布_redis 订阅 countdownlatch

redis 订阅 countdownlatch

转自 https://blog.csdn.net/myNameIssls/article/details/75471012

参考 http://tramp.cincout.cn/2017/07/03/spring-nosql-2017-07-03-spring-boot-redis-pubsub/


SpringBoot集成Redis消息订阅发布

1. pom.xml文件添加依赖
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-data-redis</artifactId>
  8. </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
2. 创建一个Redis消息接收器
  1. package cn.tyrone.springboot.redis.message;
  2. import java.util.concurrent.CountDownLatch;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. public class Receiver {
  7. private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class);
  8. private CountDownLatch latch;
  9. @Autowired
  10. public Receiver(CountDownLatch latch) {
  11. this.latch = latch;
  12. }
  13. public void receiveMessage(String message) {
  14. LOGGER.info("Received <" + message + ">");
  15. latch.countDown();
  16. }
  17. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Receiver这是一个定义了一个接收消息的方法的类。当你把这个类作为一个消息监听器来注册后,你可以自定义消息接收的方法名。本例中采用“receiveMessage”作为接收消息的方法。

3. 注册一个监听器并发送消息

Spring Data Redis 提供了使用Redis发送和接收的消息的所有的组件。我们只需要做以下配置: 
- 一个Redis连接工厂(A connection factory) 
- 一个消息监听器的容器(A message listener container) 
- 一个Redis模板(A redis template) 
我们使用redis template发送消息,把Receiver类注册为一个消息监听器以使它可以接收消息。Connection factory是授权它们连接Redis服务的。 
本例中采用的是SpringBoot默认的RedisConnectionFactory,这是一个基于jedis Redis库的JedisConnectionFactory的实例。它被注入到消息监听器和redis模板中。

编写SpringBoot启动类并注入本例需要的对象实例

  1. package cn.tyrone.springboot.redis.message;
  2. import java.util.concurrent.CountDownLatch;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.boot.SpringApplication;
  6. import org.springframework.boot.autoconfigure.SpringBootApplication;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.data.redis.connection.RedisConnectionFactory;
  10. import org.springframework.data.redis.core.StringRedisTemplate;
  11. import org.springframework.data.redis.listener.PatternTopic;
  12. import org.springframework.data.redis.listener.RedisMessageListenerContainer;
  13. import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
  14. //https://spring.io/guides/gs/messaging-redis/
  15. @SpringBootApplication
  16. public class Application {
  17. public static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
  18. /*
  19. * Redis消息监听器容器
  20. * 这个容器加载了RedisConnectionFactory和消息监听器
  21. */
  22. @Bean
  23. RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
  24. MessageListenerAdapter listenerAdapter){
  25. RedisMessageListenerContainer container = new RedisMessageListenerContainer();
  26. container.setConnectionFactory(connectionFactory);
  27. container.addMessageListener(listenerAdapter, new PatternTopic("sprinboot-redis-messaage"));
  28. return container;
  29. }
  30. /*
  31. * 将Receiver注册为一个消息监听器,并指定消息接收的方法(receiveMessage)
  32. * 如果不指定消息接收的方法,消息监听器会默认的寻找Receiver中的handleMessage这个方法作为消息接收的方法
  33. */
  34. @Bean
  35. MessageListenerAdapter listenerAdapter(Receiver receiver){
  36. return new MessageListenerAdapter(receiver, "receiveMessage");
  37. }
  38. /*
  39. * Receiver实例
  40. */
  41. @Bean
  42. Receiver receiver(CountDownLatch latch){
  43. return new Receiver(latch);
  44. }
  45. @Bean
  46. CountDownLatch latch(){
  47. return new CountDownLatch(1);
  48. }
  49. /*
  50. * Redis Template 用来发送消息
  51. */
  52. @Bean
  53. StringRedisTemplate template(RedisConnectionFactory connectionFactory){
  54. return new StringRedisTemplate(connectionFactory);
  55. }
  56. /*
  57. * 测试用例
  58. */
  59. public static void main(String[] args) throws Exception {
  60. ApplicationContext ctx = SpringApplication.run(Application.class, args);
  61. StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);
  62. // CountDownLatch latch = ctx.getBean(CountDownLatch.class);
  63. LOGGER.info("Sending message......");
  64. template.convertAndSend("sprinboot-redis-messaage", "Hello, SpringBoot redis message!!!!");
  65. // latch.wait();
  66. System.exit(0);
  67. }
  68. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

对于本例并不十分清楚CountDownLatch latch这个的目的,在测试的过程中,加上这句代码,会抛一个异常,但是发送和接收消息都是成功的。异常信息如下:

  1. 2017-07-20 10:14:50.909 INFO 7200 --- [ main] c.t.s.redis.message.Application : Sending message......
  2. Exception in thread "main" java.lang.IllegalMonitorStateException
  3. at java.lang.Object.wait(Native Method)
  4. at java.lang.Object.wait(Object.java:502)
  5. at cn.tyrone.springboot.redis.message.Application.main(Application.java:77)
  • 1
  • 2
  • 3
  • 4
  • 5

如果将此代码注释掉,该异常也将消息。同时,也并不影响消息的发布与接收。CountDownLatch 只是一个同步的辅助类,测试过程中,并没有发现这个类对测试结果的有什么帮助。



声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号