分布式锁

在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为纯数字。

使用Quartz实现定时任务

由于quartz能实现更多功能,如支持cron表达式,所以也可以选择quartz来实现定时任务,如何使用quartz,可以参考

https://www.cnblogs.com/IWings/p/14205224.html

在微服务中使用quartz和在控制台里面使用是一样的,毕竟微服务也是一个控制台程序而已,唯一需要注意,就是当程序被kill -15强制退出时,我们需要保证正在运行的定时任务执行完毕,

才允许程序退出,为了实现这一点,只需要在创建Task时,改用SafeTaskFactory创建

    public class TimingJob : IJob
{ Task IJob.Execute(IJobExecutionContext context)
{ return host.ServiceProvider.GetService<SafeTaskFactory>().StartNew(() => {
Console.WriteLine("我的任务运行了");
});
}
}

这样,程序被强行关闭时,就不会出现任务执行一半就退出的情况。

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

JMS微服务开发示例(三)使用分布式锁和编写定时任务的更多相关文章

  1. JMS微服务开发示例(一)Hello world

    网关部署 1.在网关服务器上,安装.net core 3.1运行环境: 2.到 https://www.cnblogs.com/IWings/p/13354541.html 下载Gateway.zip ...

  2. 微服务开发的最大痛点-分布式事务SEATA入门简介

    前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...

  3. .netcore 微服务快速开发框架 Anno&Viper -分布式锁是个什么鬼

    1.什么是锁 锁是为了解决多线程或者多进程资源竞争的问题. 同一进程的多个线程资源竞争可以用lock解决. lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线 ...

  4. 微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践

    eShopOnContainers eShopOnContainers是微软官方的微服务架构示例,GitHub地址https://github.com/dotnet-architecture/eSho ...

  5. SpringCloud微服务架构第三篇

    原文链接:https://www.javazhiyin.com/5130.html 微服务开发专栏:https://www.javazhiyin.com/category/springcloud Ri ...

  6. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  7. 【开源】.net微服务开发引擎Anno 让复杂的事简单点- 日志、链路追踪一目了然 (上)

    1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可视化监控.依赖第三方框架少.详情请查看<[开源].net微服务开发引擎Anno开源啦> 本章主题:. ...

  8. 构建微服务开发环境4————安装Docker及下载常用镜像

    [内容指引] 下载Docker: Mac下安装Docker: Windows下安装Docker; 下载常用docker镜像. 一.下载Docker 1.Mac适用Docker下载地址:https:// ...

  9. 构建微服务开发环境8————Hello 微服务

    [内容指引] 1.用IDEA打开微服务项目; 2.更新Maven依赖: 3.IntelliJ IDEA JDK配置; 4.修改代码: 5.运行微服务: 6.将代码变更提交到Github. 经过前面的努 ...

  10. 微服务(入门三):netcore ocelot api网关结合consul服务发现

    简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...

随机推荐

  1. ElasticSearch之cat fielddata API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/fielddata?v=true&pretty" --cacert $ES ...

  2. Python——第三章:函数的返回值

    函数的返回值: 函数执行之后. 会给调用方一个结果. 这个结果就是返回值 关于return:        函数只要执行到了return. 函数就会立即停止并返回内容. 函数内的return的后续的代 ...

  3. 关于开放签CA数字证书设计的思考

    这几天在调研CA数字证书以及思考如何在产品中集成使用CA数字证书,主要的目的和方向有以下几点: 有法律效力的电子文件的签署需要使用权威的证书颁发机构(CA)颁发的数字证书: 我们希望找到更便宜的证书方 ...

  4. spring自定义session分布式session

    spring实现自定义session.springboot实现自定义session.自定义sessionid的key.value.实现分布式会话 一.原始方案 自定义生成sessionid的值 修改t ...

  5. libGDX游戏开发之修改游戏帧数FPS(十三)

    libGDX游戏开发之修改游戏帧数FPS(十三) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网 ...

  6. JavaFX打包exe+Wind+Mac+Linux多平台分发等等

    JavaFX打包exe+Wind+Mac+Linux多平台分发等等 由于此教程相对复杂,适合对java有一定掌握的同学操作,于是我又写了一篇用idea简单打包exe的教程,文章地址:https://b ...

  7. 技术实操丨使用ModelArts和HiLens Studio完成云端验证及部署

    前言 HiLens Studio公测也出来一阵子了,亮点很多,我前些天也申请了公测,通过后赶快尝试了一下,不得不说真的很不错啊,特别是支持云端编辑代码,调试,甚至可以直接运行程序,即使自己的HiLen ...

  8. Python快速爬取车标网图片,以后不要说这什么车你不认识了!

    知识不分边界...... 人,为什么要读书?举个例子: 当看到天边飞鸟,你会说:"落霞与孤鹜齐飞,秋水共长天一色."而不是:"卧靠,好多鸟."; 当你失恋时你低 ...

  9. 可以一学的代码优化小技巧:减少if-else冗余

    摘要:if-else 语句对于程序员来说,是非常非常熟悉的一个判断语句,我们在日常开发和学习中都经常看见它. 本文分享自华为云社区<JavaScript代码之美-代码优化,减少if-else冗余 ...

  10. 当AI抄起了水表

    摘要:一套AI工作流,既减轻水表抄表工的负担,也保证了普通百姓用水数据的真实. 本文分享自华为云社区<行业案例:当AI抄起水表,一套工作流打通水务智能的"任督二脉">, ...