Spring Boot Redis使用发布订阅模式

1、pom引入

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、application.yml配置redis账号密码

spring:
  redis:
    host: localhost
    port: 6379
    database: 0

    # 连接池最大连接数(使用负值表示没有限制) 默认 8
    lettuce:
      pool:
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: -1
        # 连接池中的最大空闲连接 默认 8
        max-idle: 8
        # 连接池中的最小空闲连接 默认 0
        min-idle: 0

3、redis接收消息处理



import org.springframework.stereotype.Component;

@Component
public class RedisReceiver {

    public void receiveMessage(String message) {
        System.out.println("收到消息1:"+message);
    }

}


@Component
public class RedisReceiver2 {

    public void receiveMessage(String message) {
        System.out.println("收到消息2:"+message);
    }

}

4、Redis配置


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.example.common.model.RedisReceiver;
import org.example.common.model.RedisReceiver2;
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.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;

@Configuration
public class RedisConfig {

    @Bean
    RedisMessageListenerContainer container (RedisConnectionFactory redisConnectionFactory,RedisReceiver receive1 ,RedisReceiver2 receiver2){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        // 可以添加多个 messageListener,配置不同的交换机
        container.addMessageListener(listenerAdapter1(receive1),new PatternTopic("msg"));
        container.addMessageListener(listenerAdapter2(receiver2),new PatternTopic("msg"));
        return  container;
    }

    //消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
    @Bean(name = "receiver1")
    MessageListenerAdapter listenerAdapter1(RedisReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    @Bean(name = "receiver2")
    MessageListenerAdapter listenerAdapter2(RedisReceiver2 receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<String, Object> template = new RedisTemplate();
        //连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        //序列化配置
        Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        objectJackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //配置具体序列化
        //key采用string的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //hash的key采用string的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value序列化采用jackson
        template.setValueSerializer(objectJackson2JsonRedisSerializer);
        //hash的value序列化采用jackson
        template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}

5、发送消息测试



import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Random;

@Component
@Slf4j
public class MessageSend {

    @Autowired
    private RedisTemplate redisTemplate;

    @Scheduled(fixedRate = 3000)//定时发送
    public void sendMessage(){
        for (int i = 0; i < 5; i++) {
            redisTemplate.convertAndSend("msg",String.valueOf(new Random().nextInt(100)));
        }
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,你可以使用Redis作为消息队列来实现消息的发布和订阅。下面是一个简单的示例,演示如何在Spring Boot监听Redis消息队列: 首先,确保你的Spring Boot项目中已经配置了Redis的依赖。 创建一个消息监听,实现`MessageListener`接口,例如: ```java @Component public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String channel = new String(message.getChannel()); String body = new String(message.getBody()); System.out.println("Received message: " + body + " from channel: " + channel); // 处理接收到的消息 } } ``` 接下来,创建一个配置,配置Redis连接和消息监听器,例如: ```java @Configuration public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); configuration.setHostName("localhost"); configuration.setPort(6379); return new JedisConnectionFactory(configuration); } @Bean RedisMessageListenerContainer redisContainer() { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(jedisConnectionFactory()); container.addMessageListener(redisMessageListener(), new ChannelTopic("your-channel-name")); return container; } @Bean MessageListenerAdapter redisMessageListener() { return new MessageListenerAdapter(new RedisMessageListener()); } } ``` 在上面的配置中,你需要替换`localhost`和`6379`为你的Redis服务器的主机名和端口号,以及`your-channel-name`为你想要监听Redis频道名称。 最后,启动你的Spring Boot应用程序,当有消息发布到Redis的指定频道时,`RedisMessageListener`中的`onMessage`方法将会被调用,你可以在其中处理接收到的消息。 希望以上信息能帮助到你!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值