配置文件:
@Configuration
public class RedisConfig {
/**
* 信道名称
*/
public static String TESTCHANNEL;
@Autowired
public void setChannelName(@Value("${spring.profiles.active:test}") String profiles, @Value("${spring.application.name:scheduling}") String name) {
// 初始化信道名称
RedisConfig.TESTCHANNEL= name + ':' + profiles + ':' + "test";
}
// 配置信道监听容器
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory factory,RedisChannelCommonListener redisChannelCommonListener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
//将信道添加进容器
ArrayList<ChannelTopic> topics = new ArrayList<>();
topics.add(new ChannelTopic(TESTCHANNEL));
// 如果有多个信道,add添加即可
container.addMessageListener(redisChannelCommonListener, topics);
return container;
}
// 设置redis序列化,与本次内容无关
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return template;
}
}
生产者
装模做样封装一下
public interface RedisPublishProducer {
/**
* 发布一条消息
*/
void pulishMessage(String channel, Object message);
}
@Service
public class RedisPubLishProducerImpl implements RedisPublishProducer {
@Autowired
private RedisTemplate redisTemplate;
/**
* 发布一条消息
*
* @param channel
* @param message
*/
public void pulishMessage(String channel, Object message) {
// 生产者核心就这一行,将消息推送到指定信道,message类型自定义即可
redisTemplate.convertAndSend(channel, message);
}
}
消费者
@Component
@Slf4j
public class RedisChannelCommonListener implements MessageListener {
@Autowired
RedisTemplate redisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
// 解析出来自哪个信道
String channel = redisTemplate.getKeySerializer().deserialize(pattern).toString();
// 解析出Message内容
byte[] body = message.getBody();
Object o = redisTemplate.getValueSerializer().deserialize(body);
String s = JSONObject.toJSONString(o);
log.info("{}信道有新消息:{}", channel,s);
// 消息处理逻辑
}
}