美文网首页
年轻人不讲武德来白piao我这个老同志

年轻人不讲武德来白piao我这个老同志

作者: 码农小胖哥 | 来源:发表于2020-11-18 09:07 被阅读0次

    朋友们好啊,我是码农小胖哥。

    今天有个同学问我在吗,我说什么事?

    给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的。

    他说了两种选择,一种是用DelayQueue,一种是用消息队列。

    他说,胖哥你能不能教我点招式混元功法,帮我完成这个需求。

    我说可以!

    我说你这两种都不好用,他不服气。

    我说那你写个DelayQueue来看看,他写不出来。

    他说你这估计也不会,我说我确实不会。

    这是 JUC,传统底层开发是要讲基础的,必须融会贯通,我只会调包。

    这种定时任务我用 Redis 更简单些。

    他让我写个 DEMO,我说可以!

    我一说,他啪就发了个表情

    很快啊,我就打开 IDEA,一个 DEMO 就出来了。

    一个重写了 Redis 的 Key 失效监听器:

    /**
     *  当redis 中的key过期时,触发一个事件,并不会准点触发事件,适用于时间不是特别敏感的触发需求。
     *  我们可以算好需要执行的时间间隔作为key失效时间,这样就可以保证到点执行逻辑了。
     */
    public class RedisJobEventMessageListener extends KeyExpirationEventMessageListener {
    
        /**
         * Instantiates a new Redis event message listener.
         *
         * @param listenerContainer the listener container
         */
        public RedisEventMessageListener(RedisMessageListenerContainer listenerContainer) {
            super(listenerContainer);
        }
    
    
        @Override
        protected void doHandleMessage(Message message) {
            String key = message.toString();
            // 这个就是过期的key ,过期后,也就是事件触发后对应的value是拿不到的。
            // 这里实现业务逻辑,如果是服务器集群的话需要使用分布式锁进行抢占执行。
            System.out.println("key = " + key);
            System.out.println("end = " + LocalDateTime.now());
        }
    }
    

    一个监听器的配置:

    /**
     * Redis 消息监听器容器.
     *
     * @param redisConnectionFactory the redis connection factory
     * @return the redis message listener container
     */
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }
    
    
    /**
     * Redis 定时任务监听器注册为Bean.
     *
     * @param redisMessageListenerContainer the redis message listener container
     * @return the redis event message listener
     */
    @Bean
    public RedisJobEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
        return new RedisJobEventMessageListener(redisMessageListenerContainer);
    }
    

    一个执行测试:

    @Test
    public void redisJobTest() {
        // 调用 redisTemplate 对象设置一个10s 后过期的键,不出意外 10s 后键过期后会触发事件打印结果
        redisTemplate.boundValueOps("job").set("10s",10, TimeUnit.SECONDS);
        System.out.println("begin = " + LocalDateTime.now());
        try {
            // 测试需要休眠才能看到结果
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // ---------测试结果---------
        // begin = 2020-11-18T00:19:09.272
        // key = job
        // end = 2020-11-18T00:19:19.369
    }
    

    写完之后自然是传统编程思路点到为止,我把代码发给他,我打算放松一下,摸一摸鱼。

    我本来想让他关注我,我想着他会主动去关注。

    我大意了,没有说。

    然后十分钟后他告诉我他搞定了,而且没有关注我。

    我说同学你不讲规矩,你不懂。

    他忙说对不起,我不懂规矩啊!

    我说年轻人,

    不讲规矩,

    来,

    白嫖!

    我五年经验的小码农。

    这好吗?这不好。

    我劝这位同学,

    耗子尾汁。

    好好反思。

    好好关注。

    好好点赞。

    好好评论。

    要以和为贵,要讲规矩,

    不要老是白嫖。

    多多关注:码农小胖哥

    谢谢同学们!

    关注公众号:码农小胖哥,获取更多资讯

    个人博客:https://felord.cn

    相关文章

      网友评论

          本文标题:年轻人不讲武德来白piao我这个老同志

          本文链接:https://www.haomeiwen.com/subject/njmqiktx.html