SpringBoot 结合redis实现消息队列功能
发布者:
- 配置连接工厂
@Bean
public StringRedisTemplate template(RedisConnectionFactory connectionFactory){
return new StringRedisTemplate(connectionFactory);
}
- 配置Redis template
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void sendMessage(Object message) {
stringRedisTemplate.convertAndSend(this.productActiveMQQueue,"发送新消息");
}
订阅者:
- 创建连接工厂
- 绑定消息监听者和接收监听的方法
- 注册订阅者
- 计数器,控制线程
@Configuration
public class SubscriberConfig {
//创建连接工厂
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter,new PatternTopic("phone")); //监听phone的订阅者
return container;
}
//绑定监听者和监听方法
@Bean
public MessageListenerAdapter listenerAdapter(Receiver receiver){
return new MessageListenerAdapter(receiver,"receiveMessage"); //这里选择指定的MessageListener和指定的处理方法
}
//计数器
@Bean
public CountDownLatch latch(){
return new CountDownLatch(1);//指定了计数的次数 1
}
}
可以根据类型 多用几个类 继承MessageListener 重写onMessage() 来解析不同类型的消息,即产生不同的订阅者
public class Receiver implements MessageListener {
private CountDownLatch id;
public Receiver(CountDownLatch id)
{
this.id=id;
}
public void onMessage(Message message) {
//这里我们知道生产者发送的就是一个纯文本消息,所以这里可以直接进行强制转换,或者直接把onMessage方法的参数改成Message的子类TextMessage
TextMessage textMsg = (TextMessage) message;
System.out.println("接收到一个纯文本消息。");
try {
System.out.println("消息内容是:" + textMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
redis相对于ActiveMQ
- 入队时数据较大时,redis性能较弱
- 入队时,当数据比较小时Redis的性能要高于ActiveMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;
- 出队时,无论数据大小,Redis都表现出非常好的性能,而ActiveMQ的出队性能则远低于Redis。