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

相關文章
相關標籤/搜索