SpringBoot>12 - Redis作为消息中间件的使用。

简介:

我们熟悉的消息中间件有rabbitmq、kafka 等等,redis一般用作缓存,也可以作消息中间件使用。本章将介绍springboot1.5集成Redis后作为消息中间件的使用。集成Redis基础的知识请参看上一章【SpringBoot>11 - 集成 Redis】

个人学习总结:
链接:【springboot、springcloud、docker 等,学习目录】

Redis 作消息中间件使用

1、新建消息封装实体类:

/**
 * @Auther: xf
 * @Date: 2018/11/20 23:08
 * @Description:  存放消息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MessageInfo implements Serializable{
    private static final long serialVersionUID = -1011233794643668350L;
    private String sessionId;
    private String message;
}

2、定义消息发送器:

**
 * @Auther: xf
 * @Date: 2018/11/20 23:10
 * @Description:  消息发送器
 */
@Slf4j
@Component
public class MessageSender {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //@Scheduled(fixedRate = 2000) //间隔2s 通过StringRedisTemplate对象向redis消息队列chat频道发布消息
    public void sendMessage(MessageInfo messageInfo){
        String msg = JSON.toJSONString(messageInfo);
        log.info("转发消息 : {}", msg);
        stringRedisTemplate.convertAndSend("chat",msg);
    }
}

3、定义消息接收器:

/**
 * @Auther: xf
 * @Date: 22018/11/20 23:15
 * @Description:  消息接收器
 */
@Slf4j
@Component
public class MessageReceiver {

    /**接收消息的方法*/
    public void receiveMessage(String msg){
       log.info("收到一条消息:{}", msg);
       Map map = JSON.parseObject(msg, Map.class);
       String sessionId = map.get("sessionId");
       String message = map.get("message");
       log.info("sessionId : {}", sessionId);
       log.info("message : {}", message);
    }
}

4、在redis配置类中加入:

    /**
     * redis消息监听器容器
     * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
     * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    //相当于xml中的bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅了一个叫chat 的通道
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
        //这个container 可以添加多个 messageListener
        return container;
    }

    /**
     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    /**redis 读取内容的template */
    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }

注意:消息发送器中的通道号要和redisConfig类中redis消息监听容器中配置的一致。此处为:“chat”

5、发布消息:

/**
 * @Auther: xf
 * @Date: 2018/11/20 23:33
 * @Description:  消息发布测试
 */
@RestController
@RequestMapping("/redis/")
public class TestController {

    // Redis 消息发送器
    @Autowired
    private MessageSender messageSender;

    @RequestMapping(value = "/sendMsg/{sessionId}", method = RequestMethod.GET)
    public String sendRedisMsg(@PathVariable String sessionId) {
        MessageInfo messageInfo = new MessageInfo(sessionId,"转发请求");
        messageSender.sendMessage(messageInfo);
        return "The message of Redis sent successfully";
    }
}

5.1、测试:请求接口:http://localhost:8080/redis/sendMsg/2
在这里插入图片描述
5.2、结果:
可以看到消息转发出去被自己接收到了,这里我们可以启动多台服务器,共用同一个redis,那么A服务器发送消息,B、C… 都可以接收到。实现了 Redis做消息中间件的功能。建议:若消息自身服务器可以处理,就不在转发出去,避免死循环。

个人微信公众号,谢谢支持
SpringBoot>12 - Redis作为消息中间件的使用。_第1张图片

你可能感兴趣的:(SpringBoot,系列一,SpringBoot系列一)