everybody good…,之前有分享过关于RabbitMq的相关文章,然后公司的技术领导就跟我说,其实redis也能实现MQ的一些功能,然后我就迫不及待的去了解下,就跟大家分享下,当然了,如果你的项目中已经引用的RabbitMq或其他的Mq就算了,但一般的项目中都回用到redis嘛,建议你们可以尝试实现一个消息的发布和订阅,不管是实现发送短信啊,还是其他的,反正可以试试嘛。
因为我们的项目是使用spingboot进行开发的,所有就直接用spingboot工程给大家具体的来演示下了。
配置和引入RedisTemplate
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(objectMapper);
template.setValueSerializer(jacksonSeial);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
当然了你不配置也能直接注入进行使用
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
但如果你配置一些序列化的方式,redis服务端中保存的就是下面这段东西,表示还是手动配置序列化更好点。
通过反射将消息处理委托给目标侦听器方法的消息侦听器适配器
首个我们需要定义两个类作为消息的接收方RedisMessage ,RedisMessage2 。
@Component
public class RedisMessage2 {
@Autowired
private RedisTemplate redisTemplate;
public void onMessage2(String message) {
System.out.println("接收到的消息是:" + message);
}
}
然后再通过消息监听适配器将两个消费者给定义出来,并且指定出消费的方法,我这里用来消费的方法就是onMessage(),方法中的参数你也可以定义一个Object对象来接受。
@Bean
public MessageListenerAdapter adapter(RedisMessage message) {
return new MessageListenerAdapter(message, "onMessage");
}
@Bean
public MessageListenerAdapter adapter2(RedisMessage2 message2) {
return new MessageListenerAdapter(message2, "onMessage2");
}
然后我们还需要定义一个组件RedisMessageListenerContainer,他的作用就是容器为Redis消息监听器提供异步行为。处理聆听的底层细节,转换和消息调度。
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter adapter,MessageListenerAdapter adapter2) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//上面已经自定义了一个消息的监听器,addMessageListener就是将我们自定义的
//监听器加入到我们的容器中,且绑定一个队列,指定模式切指定channel
container.addMessageListener(adapter, new PatternTopic("msg"));
//我绑定了两个
container.addMessageListener(adapter2, new PatternTopic("msg2"));
return container;
}
以上就是定义了一个完整小消费者了。接下来就可以往我们的channel中发送消息了。
发送消息的代码其实挺简单的。
//Publishes the given message to the given channel.
//翻译:将给定的消息发布到给定的通道。
redisTemplate.convertAndSend("msg","罗里发送了一个消息");
以上就是使用使用redis实现消息的简易发送与订阅接受。