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

分布式锁

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

    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);
        }
    }

注册定时任务ui

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

若是定时任务时间间隔单位较大,应设置Times属性this

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

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

定时任务默认支持依赖注入,因此,注入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。code

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

 

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

相关文章
相关标签/搜索