Redis实现消息队列(2)——通过spring-boot-starter-data-redis发布和订阅消息

    xiaoxiao2022-07-06  180

    1.引入jar包

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>io.github.xiaoyudeguang</groupId> <artifactId>easy-core</artifactId> <version>1.2.23-RELEASE</version> </dependency>

    2.  RedisUtils工具类

    @EasyBean(todo = { "redis工具类" }) public class RedisUtils { private static StringRedisTemplate stringRedisTemplate; @Autowired(required = false) public RedisUtils(StringRedisTemplate stringRedisTemplate) { RedisUtils.stringRedisTemplate = stringRedisTemplate; } /** * 获取redis连接工厂 * @return */ public static RedisConnectionFactory getConnectionFactory() { return stringRedisTemplate.getConnectionFactory(); } /** * 添加hash键值对 * @param key * @param value */ public static void putHashValue(String key, String value) { stringRedisTemplate.opsForValue().set(key, value); } /** * 添加hash键值对 * @param key * @param value */ public static void setHashValue(String key, String value) { stringRedisTemplate.opsForValue().set(key, value); } /** * 根据key得到hash值 * @param key * @param value */ public static String getHashValue(String key) { return stringRedisTemplate.opsForValue().get(key); } /** * list队列中左侧添加 * @param key * @param value * @return */ public static Long leftPush(String key, String value) { return stringRedisTemplate.opsForList().leftPush(key, value); } /** * list队列中右侧取出 * @param key * @return */ public static String rightPop(String key) { return stringRedisTemplate.opsForList().rightPop(key); } /** * 删除某个key * @param key * @return */ public static Boolean delete(String key) { return stringRedisTemplate.delete(key); } /** * 发布消息 * @param channel * @param message */ public static void publish(String channel, Object message){ stringRedisTemplate.convertAndSend(channel, JSON.toJSONString(message)); } /** * 发布消息 * @param channel * @param message * @return */ @SuppressWarnings("unchecked") public static <T> T deserialize(byte[] bytes){ return (T) stringRedisTemplate.getValueSerializer().deserialize(bytes); } }

    3. 发布消息

    RedisUtils.publish("自定义消息通道名称", "消息内容");

    4.  注册订阅通道

    @Configuration public class RedisConfig { @Autowired(required = false) private MessageListener listener; @Bean public RedisMessageListenerContainer redisMessageListenerContainer() { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(RedisUtils.getConnectionFactory()); container.addMessageListener(listener, new ChannelTopic("自定义消息通道名称1")); container.addMessageListener(listener, new ChannelTopic("自定义消息通道名称2")); return container; } }

    5.  实现订阅接口

    @EasyBean(todo = { "接收redis消息" }) public class RedisMsgListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String key = RedisUtils.deserialize(pattern); //消息通道名称 String msg = RedisUtils.deserialize(message.getBody()); //消息内容 LogUtils.info(this, key + "订阅消息", message); } }

     

    最新回复(0)