zoukankan      html  css  js  c++  java
  • 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为纯数字。

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

  • 相关阅读:
    python语言中的编码问题(续)
    python语言中的编码问题
    如何为eclipse安装合适版本的python插件pydev
    JavaScript 中的变量命名方法
    使用tomcat manager 管理和部署项目
    不同地图坐标系的经纬度转换方法
    tomcat项目中文乱码问题解决方法
    CATransition(os开发之画面切换) 的简单用法
    星级评价 实现
    ASIHttpRequest 使用理解
  • 原文地址:https://www.cnblogs.com/IWings/p/13359869.html
Copyright © 2011-2022 走看看