spring基于redis实现消息订阅

阅读数:100 评论数: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"));



相关推荐

当然可以自己写redis的工具类,或者使用第三方开源jar包或代码,这里使用spring boot的集成类。 一、pom依赖 <dependency> <gro

mvn依赖 &lt;dependency&gt; &lt;groupId

一、简介 分布式锁,其原理就是多台机器去争抢一个资源,谁争抢成功,那么就持有这把锁。 可以通过多种途径实现分布式锁,例如数据库,插入一条记录(唯一索引),谁插入成功,谁就持有;还可以通过zookeep

(1)Spring MVC是一个基于DispatcherServlet的MVC框架,DispatcherServlet是继承自HttpServlet的。Spring的IOC和AOP主要就用了java的

如果一个类交张spring管理,比如 &lt;bean id="foo1" class="demo.scope.foo" /&gt; 不指明scope就是单例。</p

@PathParam的声明允许你在URI路径中去映射你的方法将使用的参数。 @Path("/library") pu

方式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