• JMS微服务开发示例(三)使用分布式锁和编写定时任务


    分布式锁

    在Controller当中,提供了分布式锁的功能,代码如下:

        class HelloworldController : MicroServiceControllerBase
        {
            static List<string> Users = new List<string>();
    
            ILogger<HelloworldController> _logger;
            public HelloworldController(ILogger<HelloworldController> logger)
            {
                _logger = logger;
            }
    
            public void Test()
            {
                //锁定指定的key
                if( this.TryLock("my key"))
                {
                    _logger.LogInformation("锁成功");
    
                    //使用完毕这里记住要释放锁
                    this.TryUnLock("my key");
                }
            }
        }

    编写定时任务

    创建一个类,实现JMS.IScheduleTask接口

        class AutoRun : JMS.IScheduleTask
        {
            public double[] Timers => null;
    
            public int Interval => 5000;//设置每隔5秒执行一次
    
            public void Run()
            {
                Console.WriteLine("auto running at " + DateTime.Now);
            }
        }

    注册定时任务

                var msp = new MicroServiceHost(services);
                msp.Register<HelloworldController>("Hello world");
                msp.RegisterScheduleTask<AutoRun>();
                msp.Build(port, gateways)
                    .Run();

    如果定时任务时间间隔单位较大,应设置Times属性

    如:Times = new [] { 11.30  18.45 }  表示在每天的11:30 和 18:45 分别执行一次

    在定时任务中使用分布式锁

    定时任务默认支持依赖注入,所以,注入IKeyLocker即可使用分布式锁

        class AutoRun : JMS.IScheduleTask
        {
            IKeyLocker _keyLocker;
            public AutoRun(IKeyLocker keyLocker)
            {
                _keyLocker = keyLocker;
            }
            public double[] Timers => new[] { 11.47 };
    
            public int Interval => 0;
    
            public void Run()
            {
                var tranid = $"A{ Thread.CurrentThread.ManagedThreadId }";
    
                if( _keyLocker.TryLock(tranid, "test"))
                {
                    _keyLocker.TryUnLock(tranid, "test");
                }
                Console.WriteLine("auto running at " + DateTime.Now);
            }
        }

    tranid是自定义的事务id,为了和controller事务id 区分开来,我使用了字母+线程id的规则生成一个事务id。

    controller当中默认事务id为纯数字。

    上一篇 示例(二)    下一篇 示例(四)

  • 相关阅读:
    顶目群定义及项目群管理
    项目管理与项目组合管理的不同
    IT项目经理:人际关系技能和领导技能的重要性
    IT 项目经理的职业生涯
    Sharepoint2010 中隐藏 "快速启动"与"最近修改'
    3 个基本的IT项目组合种类
    项目成功的标志及决定因素
    HDL,你们作对了吗?
    JAVA代码编写的30条建议
    八款开源 Android 游戏引擎
  • 原文地址:https://www.cnblogs.com/IWings/p/13359869.html
Copyright © 2020-2023  润新知