首页 > 其他分享 >设计模式之美学习-一些反思

设计模式之美学习-一些反思

时间:2024-02-19 18:12:52浏览次数:22  
标签:String 之美 private 反思 new message 设计模式 redisOperationService taskName

系统的看完各个设计模式,和开闭原则,实际中其实往往想不到如何使用

比如业务场景,通过redis来模拟延迟消息处理

还是采用传统思维模式

写入消息

     // 离线列表 延迟一分钟
        redisOperationService.zaddWithPrefix(BusinessRedisKeyDefinition.SESSION_STATE_OFFLINE_QUEUE.get(privateProviderId), System.currentTimeMillis() + 60000, key, expirationDate);
    

定时任务扫描处理

   Date currentDate = new Date();
        // 每次处理100条
        final Set<Tuple> tuples = redisOperationService.zrangeByScoreWithScores(queueKey, 0, Long.valueOf(currentDate.getTime()).doubleValue(), 0, 100);
        

但是为什么不统一封装设计呢

public interface MessageInvoker {
     void invoke(String message);
}

 

public class RedisJobScheduler {
    MessageInvoker messageInvoker;
    private RedisOperationService redisOperationService;
    // 扫描频率
    private Integer interval = 1000;
    // 默认处理行数
    private Integer batchProcessNumber = 10;
    // 任务不活跃多久自动过期
    private int expirationDate = 60 * 60 * 12 * 2 * 2;
    private String taskName;

    public void addJob(String message, Integer delayMillis) {
        redisOperationService.zaddWithPrefix(taskName, System.currentTimeMillis() + delayMillis, message, expirationDate);
    }

    public void startJob() {
        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(interval);
                    // 1. 获取消息
                    Set<String> messageName = redisOperationService.zrangeByScoreWithPrefix(taskName, 0, Long.valueOf(new Date().getTime()).doubleValue(), 0, batchProcessNumber);
                    for (String message : messageName) {
                        // 3. 处理任务
                        messageInvoker.invoke(message);
                        // 4. 删除任务
                        redisOperationService.zremWithPrefix(taskName, message);
                    }
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
    }
}

 这里startjob还可以采用动态新建的方式

https://www.cnblogs.com/LQBlog/p/17188613.html

标签:String,之美,private,反思,new,message,设计模式,redisOperationService,taskName
From: https://www.cnblogs.com/LQBlog/p/18021697

相关文章

  • 设计模式浅析(四) ·工厂模式
    设计模式浅析(四)·工厂模式日常叨逼叨观众老爷们新春吉祥......
  • Unity常用设计模式之工厂模式
    工厂模式是一种常用的设计模式,它属于创建型模式,用于创建对象的过程中。在Unity中,工厂模式可以帮助我们更好地管理和创建对象,提高代码的可维护性和可扩展性。接下来,我将详细介绍Unity中常用的工厂模式。一、工厂模式概述工厂模式是一种创建型设计模式,它提供了一个统一的接口来创......
  • [设计模式]创建型模式-单例模式
    前言单例模式是最简单的一种模式。在Go中,单例模式指的是全局只有一个实例,并且它负责创建自己的对象。单例模式有减少内存和系统资源开销、防止多个实例产生冲突等优点。因为单例模式保证了实例的全局唯一性,并且只被初始化一次,所以比较适合全局共享一个实例,且只需要被初始化一次......
  • [设计模式]行为型模式-策略模式
    前言策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变换不会影响使用算法的客户。在项目开发中,我们经常要根据不同的场景,采取不同的措施,也就是不同的策略。假设我们需要对a、b这两个整数进行计算,根据条件的不同,需要执行不同的计算方式。我们可以把所......
  • Unity常用设计模式之代理模式
    代理模式是一种常用的设计模式,它允许一个对象代表另一个对象进行访问。在Unity中,代理模式经常被用来控制对某些对象的访问,以便在访问对象的同时进行一些额外的操作,比如权限控制、缓存、日志记录等。代理模式的结构包括三个角色:抽象主题(Subject)、真实主题(RealSubject)和代理(Proxy)。......
  • 【赛后反思】【LGR-175 Div.4】 洛谷入门赛#20 赛后反思
    洛谷入门赛#20赛后反思今日推歌:《水与水之歌feat.绮萱》きくお呆在这里直到精神恍惚为止让我们一起快乐地玩耍我们术术人有自己的《让我们荡起双桨》(大雾Before先看结果(是同步赛的成绩,因为前一天晚上我在死磕dfs):省流:暴力-纯度75%STL-纯度25%展开目录目录洛谷入......
  • WPF新境界:MVVM设计模式解析与实战,构建清晰可维护的用户界面
     概述:MVVM是一种在WPF开发中广泛应用的设计模式,通过将应用程序分为模型、视图、和视图模型,实现了解耦、提高可维护性的目标。典型应用示例展示了如何通过XAML、ViewModel和数据绑定创建清晰、可测试的用户界面。什么是MVVM?MVVM(Model-View-ViewModel)是一种用于构建用户界面的......
  • SpringBoot整合OSS中的设计模式----单例模式
    在SpringBoot项目中使用OSS存储上传的图片,需要配置OSS设置信息。避免对象的重复创建,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,于是用到了单例模式,这里复习一下单例模式。单线程----懒汉式@Data@Component@ConfigurationProperties(prefix="aliyun.oss")pu......
  • 设计模式之单例模式
    经过多方博客,文章参考,枚举是实现单例模式的最好方式publicenumSingleton{INSTANCE;publicvoidbusinessMethod(){System.out.println("我是一个单例!");}}publicclassMainClass{publicstaticvoidmain(String[]args){Si......
  • 设计模式--策略模式(Strategy Pattern)
    策略模式(StrategyPattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户端。策略模式主要包含以下几个角色:Strategy(策略):这是一个接口,通常用于定义所有支持的算法的公共接口。ConcreteStrategy(具体策略):这是实现了S......