spring基于redis实现消息订阅
阅读数:229 评论数:0
跳转到新版页面分类
python/Java
正文
1、依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
2、注册主题
@Configuration
public class RedisConfig {
/**
* 配置主题订阅
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
List<PatternTopic> topics = Arrays.asList(
// 要监听的主题,字符串即可
new PatternTopic(GlobalConst.REDIRECT_CMD_TOPIC),
new PatternTopic(GlobalConst.RETURN_MESSAGE_TOPIC)
);
listenerContainer.addMessageListener(listenerAdapter, topics);
return listenerContainer;
}
}
3、消费主题
@Component
@Slf4j
public class RedirectCmdListener extends MessageListenerAdapter {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 收到消息后
*/
@Override
public void onMessage(Message message, byte[] pattern) {
log.info("====================指令转发收到消息: {}==================", new String(message.getBody(), StandardCharsets.UTF_8));
// 获得当前消息的主题名称
String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
// 反序列化回消息(如果确认发送的消息类型的话,可以强转)
Object messageValue = redisTemplate.getValueSerializer().deserialize(message.getBody());
// 区分主题,然后做不同的处理
if (GlobalConst.REDIRECT_CMD_TOPIC.equals(channel)) {
// 强转回自己的数据对象类型,然后做自己的业务
if (messageValue instanceof User) {
}
} else if (GlobalConst.RETURN_MESSAGE_TOPIC.equals(channel)) {
// 强转回自己的数据对象类型,然后做自己的业务
if (messageValue instanceof String) {
}
}
}
/**
* 监听消息异常
* @param ex
*/
@Override
protected void handleListenerException(Throwable ex) {
log.error("Listener execution failed", ex);
}
}
4、发送消息
// 要发往的主题,要发送的数据(任意类型)
redisTemplate.convertAndSend(GlobalConst.REDIRECT_CMD_TOPIC, new User().setId("测试").setName("hahaha"));
相关推荐
一、简介
分布式锁,其原理就是多台机器去争抢一个资源,谁争抢成功,那么就持有这把锁。
可以通过多种途径实现分布式锁,例如数据库,插入一条记录(唯一索引),谁插入成功,谁就持有;还可以通过zookeep
(1)Spring MVC是一个基于DispatcherServlet的MVC框架,DispatcherServlet是继承自HttpServlet的。Spring的IOC和AOP主要就用了java的
方式1:通过@PostConstruct和@PreDestroy方法。
从Java EE5开始,Servlet增加了两个影响Servlet生命周期的注解。
方式2:通
一、概述
1、spring容器
spring中有三种bean容器:BeanFactory、ApplicationContext、WebApplicationContext。
(1)BeanFactor
有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进
一、request uri部分 @PathVariable
获取路径参数,形如url/{id}
二、request header部分 @RequestHeade