spring boot redis 发布订阅,java redis消息订阅与发布
00-1010 1.什么是redis发布和订阅2。Redis出版和订阅。命令行实现函数订阅主题模式匹配订阅发布消息退订测试4。SpringBoot实现功能Springboot集成Redis配置消息监控测试
00-1010官网的文档介绍里有一行:Redis是一个快速稳定的发布/订阅消息系统。
00-1010机制
Redis提供发布和订阅功能,可用于消息传输。Redis的发布和订阅机制包括三个部分:发布者、订阅者和通道(主题或队列)。
目录
1.什么是redis的发布与订阅
Redis使用SUBSCRIBE channel命令订阅主题。返回的参数subscribe表示主题已经成功订阅,第二个参数表示订阅的主题名称,第三个参数表示当前的订阅号。
127.0.0.1:6379订购支付成功阅读消息.(按Ctrl-C退出)1)订阅 2)下单-支付-成功 3)(整数)1
00-1010模式匹配功能允许客户端伪订阅与特定模式匹配的通道。Redis通过使用subscription channel命令订阅所有匹配特定模式的通道。该模式用*表示,可以用任何值替换。
127 . 0 . 0 . 1:6379 PSU订阅订单-支付-*阅读消息.(按Ctrl-C退出)1) PSU subscribe 2) ORDER-PAY-* 3)(整数)1
2.Redis发布订阅
Redis使用发布通道消息命令发布关于某个主题的消息,返回的参数是收到消息的订阅者数量。
127.0.0.1:6379发布订单支付成功DD202109071525(整数)1
3.命令行实现功能
Redis使用UNSUBSCRIBE channel或PUNSUBSCRIBE channel命令取消某个话题的订阅。因为Redis的订阅操作是阻塞的,一旦客户端订阅了某个频道或模式,就会一直停留在订阅状态,直到退出。在subscribe、SUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE命令中,返回值都包含客户端当前订阅的频道和模式的数量。当该数字变为0时,客户端将自动退出订阅状态。
127.0.0.1:6379退订订单-支付-成功1)退订 2)订单-支付-成功 3)(整数)0127 . 0 . 0 . 1:6379 punsuble订单-支付-成功1) punsuble 2)订单-支付-成功 3)(整数)0
00-1010首先,三个订户订阅订单支付成功主题。当发送者在此主题内发送订单号时,所有订阅者都将收到此主题的消息。
订阅主题
00-1010相关性包介绍
依赖性依赖性groupIdorg.springframework.boot/groupId artifactId spring-boot-starter/artifactId version2.2.10.RELEASE/version/depende
ncy> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.4.1</version> </dependency> </dependencies>配置yaml文件
server: port: 8888spring: application: name: spring-boot-redis redis: host: 127.0.0.1 port: 6379
配置消息监听
import com.demo.redis.listener.MessageListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.listener.PatternTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;/** * @author Bai * @date 2021/4/29 上午 11:17 * @description */@Configurationpublic class RedisMessageConfig { /** * 监听订单支付完成主题 */ private static final String ORDER_PAY_SUCCESS = "ORDER-PAY-SUCCESS"; /** * 注入消息监听适配器 * @param messageListener * @return {@link MessageListenerAdapter} * @throws * @author Bai * @date 2021/9/7 下午 03:54 */ @Bean public MessageListenerAdapter getMessageListenerAdapter(MessageListener messageListener){ return new MessageListenerAdapter(messageListener, "onMessage"); } /** * 注入消息监听容器 * @param redisConnectionFactory * @param messageListenerAdapter * @return {@link RedisMessageListenerContainer} * @throws * @author Bai * @date 2021/9/7 下午 03:54 */ @Bean public RedisMessageListenerContainer getRedisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter){ RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer(); redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory); //订阅订单支付成功主题 redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(ORDER_PAY_SUCCESS)); return redisMessageListenerContainer; } /** * 处理内容 * @param connectionFactory * @return {@link StringRedisTemplate} * @throws * @author Bai * @date 2021/9/7 下午 04:01 */ @Bean StringRedisTemplate template(RedisConnectionFactory connectionFactory) { return new StringRedisTemplate(connectionFactory); }}
接收消息
import org.springframework.stereotype.Component;/** * @author Bai * @date 2021/9/7 下午 03:51 * @description */@Componentpublic class MessageListener { public void onMessage(String message){ System.out.println("接收消息:" + message); }}
测试
发送订单支付成功的消息
import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;/** * @author Bai * @date 2021/9/7 下午 04:32 * @description */@RunWith(value = SpringRunner.class)@SpringBootTestpublic class RedisPubTest { /** * 订单支付完成主题 */ private static final String ORDER_PAY_SUCCESS = "ORDER-PAY-SUCCESS"; @Resource private StringRedisTemplate stringRedisTemplate; /** * 模拟发送5调订单支付完成的消息 * @throws * @author Bai * @date 2021/9/7 下午 04:57 */ @Test public void sendMessage(){ for (int i = 0; i < 5; i++) { stringRedisTemplate.convertAndSend(ORDER_PAY_SUCCESS,"DD" + System.currentTimeMillis()); } }}
接收到订单支付成功的消息
. ____ _ __ _ _/\ / ___'_ __ _ _(_)_ __ __ _ ( ( )___ '_ '_ '_ / _` \/ ___) _) (_ ) ) ) ) ' ____ .___ __ ___, / / / /=========_==============___/=/_/_/_/:: Spring Boot :: (v2.2.10.RELEASE)
2021-09-07 16:56:54.729 INFO 3712 --- [ main] com.demo.redis.RedisSubPubApplication : Starting RedisSubPubApplication on DESKTOP-595LI4G with PID 3712 (D:BaiSourcesspring-boot-demoredis-sub-pubtargetclasses started by 1 in D:BaiSourcesspring-boot-demo)2021-09-07 16:56:54.735 INFO 3712 --- [ main] com.demo.redis.RedisSubPubApplication : No active profile set, falling back to default profiles: default2021-09-07 16:56:55.205 INFO 3712 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!2021-09-07 16:56:55.207 INFO 3712 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.2021-09-07 16:56:55.229 INFO 3712 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 11 ms. Found 0 Redis repository interfaces.2021-09-07 16:56:55.557 INFO 3712 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8888 (http)2021-09-07 16:56:55.565 INFO 3712 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2021-09-07 16:56:55.565 INFO 3712 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.38]2021-09-07 16:56:55.669 INFO 3712 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2021-09-07 16:56:55.669 INFO 3712 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 895 ms2021-09-07 16:56:56.032 INFO 3712 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'2021-09-07 16:56:56.950 INFO 3712 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8888 (http) with context path ''2021-09-07 16:56:56.952 INFO 3712 --- [ main] com.demo.redis.RedisSubPubApplication : Started RedisSubPubApplication in 2.557 seconds (JVM running for 3.436)接收消息:DD1631005025949接收消息:DD1631005025964接收消息:DD1631005025965接收消息:DD1631005025967接收消息:DD1631005025968
到此这篇关于SpringBoot+Redis实现消息的发布与订阅的示例代码的文章就介绍到这了,更多相关SpringBoot Redis消息发布与订阅内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。