视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
redis的发布订阅功能
2020-11-09 06:57:17 责编:小采
文档


redis提供了简单的发布订阅功能,对于一些合适的场景(比如不要求消费者不在线时也能收到离线消息),比起专业的MQ来说,用起来更简单些。本文主要是记录下怎么在SpringBoot里头使用redis的发布订阅功能。

定义生产者

配置

@Bean
 MyPublisher redisPublisher(RedisConnectionFactory factory) {
 return new MyPublisher( redisTemplate(factory), topic() );
 }
 @Bean
 ChannelTopic topic() {
 return new ChannelTopic( "pubsub:queue" );
 }

生产者实例

public class MyPublisher {
 private final RedisTemplate< String, Object > template;
 private final ChannelTopic topic;
 private final AtomicLong counter = new AtomicLong( 0 );
 public MyPublisher( final RedisTemplate< String, Object > template,
 final ChannelTopic topic ) {
 this.template = template;
 this.topic = topic;
 }
 @Scheduled( fixedDelay = 100 )
 public void publish() {
 template.convertAndSend( topic.getTopic(), "Message " + counter.incrementAndGet() +
 ", " + Thread.currentThread().getName() );
 }
}

定义消费者

配置

//subscribe
 @Bean
 MessageListenerAdapter messageListener() {
 return new MessageListenerAdapter( new MyMessageListener() );
 }
 @Bean
 RedisMessageListenerContainer redisContainer(RedisConnectionFactory factory) {
 final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
 container.setConnectionFactory(factory);
 container.addMessageListener(messageListener(), topic());
 return container;
 }

消费者实例

public class MyMessageListener implements MessageListener {
 @Override
 public void onMessage( final Message message, final byte[] pattern ) {
 System.out.println( "Message received: " + message.toString() );
 }
}

运行

 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v1.3.2.RELEASE)
2016-02-16 00:14:08.190 INFO 1481 --- [ main] com.codecraft.RedisdemoApplication : Starting RedisdemoApplication on Jupiter.local with PID 1481 (/Users/codecraft/workspace/redisdemo/target/classes started by codecraft in /Users/codecraft/workspace/redisdemo)
2016-02-16 00:14:08.193 INFO 1481 --- [ main] com.codecraft.RedisdemoApplication : No active profile set, falling back to default profiles: default
2016-02-16 00:14:08.242 INFO 1481 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@140e5a13: startup date [Tue Feb 16 00:14:08 CST 2016]; root of context hierarchy
2016-02-16 00:14:09.756 INFO 1481 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2016-02-16 00:14:09.763 INFO 1481 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
2016-02-16 00:14:09.807 INFO 1481 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 21474837
2016-02-16 00:14:09.7 INFO 1481 --- [ main] com.codecraft.RedisdemoApplication : Started RedisdemoApplication in 2.215 seconds (JVM running for 2.5)
Message received: "Message 1, pool-1-thread-1"
Message received: "Message 2, pool-1-thread-1"
Message received: "Message 3, pool-1-thread-1"
Message received: "Message 4, pool-1-thread-1"
Message received: "Message 5, pool-1-thread-1"
Message received: "Message 6, pool-1-thread-1"
Message received: "Message 7, pool-1-thread-1"
Message received: "Message 8, pool-1-thread-1"
Message received: "Message 9, pool-1-thread-1"
Message received: "Message 10, pool-1-thread-1"

下载本文
显示全文
专题