Springboot 使用Redis发布/订阅模式

3 篇文章 0 订阅

1.新增依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2.配置redis

  1. 配置连接

    spring:
        redis:
            host: localhost
            port: 6379
            password: root
    
  2. 发布者配置

    @Configuration
    public class PublisherConfig {
        @Bean
        public RedisTemplate<String, Object> redisMessageTemplate(RedisConnectionFactory connectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory);
            template.setDefaultSerializer(new FastJsonRedisSerializer<>(Object.class));
            return template;
        }
    }
    
  3. 订阅者配置

    @Configuration
    public class ReceiverConfig {
    
        @Bean
        public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter userListenerAdapter,MessageListenerAdapter goodsListenerAdapter) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            // 订阅者topic为user 与发布者的发布topic必须对应
            container.addMessageListener(userListenerAdapter, new PatternTopic("user"));
            // 订阅者topic为goods 与发布者的发布topic必须对应
            container.addMessageListener(goodsListenerAdapter, new PatternTopic("goods"));
            return container;
        }
    
        @Bean
        public MessageListenerAdapter userListenerAdapter(UserReceiver receiver) {
            return new MessageListenerAdapter(receiver, "receiveMessage");
        }
    
        @Bean
        public MessageListenerAdapter goodsListenerAdapter(GoodsReceiver receiver) {
            return new MessageListenerAdapter(receiver, "receiveMessage");
        }
    
        @Bean
        public UserReceiver userReceiver() {
            return new UserReceiver();
        }
    
        @Bean
        public GoodsReceiver goodsReceiver() {
            return new GoodsReceiver();
        }
    
    }
    

3.发布者 消息模型

@Data
public class RedisMessage implements Serializable {
    public String msgId;
    public long createStamp;
}
@EqualsAndHashCode(callSuper = true)
@Data
public class GoodsMessage extends RedisMessage {
    private String goodsType;
    private String number;
}
@EqualsAndHashCode(callSuper = true)
@Data
public class UserMessage extends RedisMessage {
    private String userId;
    private String username;
    private String password;
}

4.发布者 消息发布

@Service
public class Publisher {
    private final RedisTemplate<String, Object> redisMessageTemplate;

    @Autowired
    public Publisher(RedisTemplate<String, Object> redisMessageTemplate) {
        this.redisMessageTemplate = redisMessageTemplate;
    }

    public void pushMessage(String topic, RedisMessage message) {
        redisMessageTemplate.convertAndSend(topic,message);
    }
}

5.订阅者 消息订阅

public abstract class AbstractReceiver {
    public abstract void receiveMessage(Object message);
}
@Slf4j
public class GoodsReceiver extends AbstractReceiver {
    @Override
    public void receiveMessage(Object message) {
        log.info("接收到商品消息:{}", JSON.toJSONString(message));
    }
}
@Slf4j
public class UserReceiver extends AbstractReceiver {
    @Override
    public void receiveMessage(Object message) {
        log.info("接收到用户消息:{}", JSON.toJSONString(message));
    }
}

6.发布者  测试发布消息

@Autowired
RedisPublisher publisher;


@Test
public void pushMessage() {
    UserMessage userMessage = new UserMessage();
    userMessage.setMsgId(UUID.randomUUID().toString().replace("-",""));
    userMessage.setUserId("1");
    userMessage.setUsername("admin");
    userMessage.setUsername("root");
    userMessage.setCreateStamp(System.currentTimeMillis());
    // 必须与订阅者中user的topic一致
    publisher.pushMessage("user",userMessage);
    GoodsMessage goodsMessage = new GoodsMessage();
    goodsMessage.setMsgId(UUID.randomUUID().toString().replace("-",""));
    goodsMessage.setGoodsType("苹果");
    goodsMessage.setNumber("十箱");
    goodsMessage.setCreateStamp(System.currentTimeMillis());
    // 必须与订阅者中goods的topic一致
    publisher.pushMessage("goods",goodsMessage);
}

订阅者  接收测试结果如下:

2018-09-28 12:02:16.281  INFO 25244 --- [           main] org.zxl.redismq.core.PublisherTest   : Started PublisherTest in 2.889 seconds (JVM running for 3.723)
2018-09-28 12:02:16.544  INFO 25244 --- [    container-2] org.zxl.redismq.core.UserReceiver    : 接收到用户消息:"{\"createStamp\":1538107336525,\"msgId\":\"62c60489199545209f036d5eeffc353e\",\"userId\":\"1\",\"username\":\"root\"}"
2018-09-28 12:02:16.547  INFO 25244 --- [    container-3] org.zxl.redismq.core.GoodsReceiver   : 接收到商品消息:"{\"createStamp\":1538107336543,\"goodsType\":\"苹果\",\"msgId\":\"b0ee90c6635444c490afc691a3c5cf74\",\"number\":\"十箱\"}"
2018-09-28 12:02:16.551  INFO 25244 --- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@1a4927d6: startup date [Fri Sep 28 12:02:13 CST 2018]; root of context hierarchy
2018-09-28 12:02:16.552  INFO 25244 --- [       Thread-2] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 2147483647

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值