Springboot集成redis实现订阅发布
1. 添加依赖
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 修改application.yml文件,配置redis
server:
port: 8080
spring:
redis:
host: 127.0.0.1
password: test
port: 6379
3. 添加配置
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
4. 配置发布者
@Configuration
public class PubConfig {
@Bean
public ChannelTopic topic() {
return new ChannelTopic( "test" );
}
}
5. 订阅者监听类
@Component
public class MsgListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
System.out.println( "Message: " + message.toString() );
}
}
6. 配置订阅者
@Configuration
public class SubConfig {
@Bean
public MessageListenerAdapter messageListenerAdapter() {
return new MessageListenerAdapter(new MsgListener());
}
@Bean
RedisMessageListenerContainer redisContainer(RedisConnectionFactory factory) {
final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(messageListenerAdapter(), new ChannelTopic( "test" ));
return container;
}
}
7. 测试
@RestController
@RequestMapping("test")
public class AlarmController {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private ChannelTopic topic;
@PostMapping("/test")
public Object test(@RequestBody Map<Object, Object> map) {
System.out.println(map);
redisTemplate.convertAndSend( topic.getTopic(), "Message: " + map +
";Time:" + Calendar.getInstance().getTime());
return map;
}
}