简介:
我们熟悉的消息中间件有rabbitmq、kafka 等等,redis一般用作缓存,也可以作消息中间件使用。本章将介绍springboot1.5集成Redis后作为消息中间件的使用。集成Redis基础的知识请参看上一章【SpringBoot>11 - 集成 Redis】
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<String, String> 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做消息中间件的功能。建议:若消息自身服务器可以处理,就不在转发出去,避免死循环。
说明:
此博客主要是以学习、分享为主。互联网相关的文章很多,如有雷同,还望包涵,如有错误,希望留言或联系我指出。
联系我:
QQ:1421925880
相关springboot、springcloud、docker等文章关注微信公众号: