在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