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为纯数字。
使用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微服务开发示例(三)使用分布式锁和编写定时任务的更多相关文章
- JMS微服务开发示例(一)Hello world
网关部署 1.在网关服务器上,安装.net core 3.1运行环境: 2.到 https://www.cnblogs.com/IWings/p/13354541.html 下载Gateway.zip ...
- 微服务开发的最大痛点-分布式事务SEATA入门简介
前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...
- .netcore 微服务快速开发框架 Anno&Viper -分布式锁是个什么鬼
1.什么是锁 锁是为了解决多线程或者多进程资源竞争的问题. 同一进程的多个线程资源竞争可以用lock解决. lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线 ...
- 微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践
eShopOnContainers eShopOnContainers是微软官方的微服务架构示例,GitHub地址https://github.com/dotnet-architecture/eSho ...
- SpringCloud微服务架构第三篇
原文链接:https://www.javazhiyin.com/5130.html 微服务开发专栏:https://www.javazhiyin.com/category/springcloud Ri ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- 【开源】.net微服务开发引擎Anno 让复杂的事简单点- 日志、链路追踪一目了然 (上)
1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可视化监控.依赖第三方框架少.详情请查看<[开源].net微服务开发引擎Anno开源啦> 本章主题:. ...
- 构建微服务开发环境4————安装Docker及下载常用镜像
[内容指引] 下载Docker: Mac下安装Docker: Windows下安装Docker; 下载常用docker镜像. 一.下载Docker 1.Mac适用Docker下载地址:https:// ...
- 构建微服务开发环境8————Hello 微服务
[内容指引] 1.用IDEA打开微服务项目; 2.更新Maven依赖: 3.IntelliJ IDEA JDK配置; 4.修改代码: 5.运行微服务: 6.将代码变更提交到Github. 经过前面的努 ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
随机推荐
- ElasticSearch之Shard request cache settings
对于查询操作,Elasticsearch提供了缓存特性来暂存结果. 对于相同条件的查询请求,在缓存中的数据失效前,响应后续的查询操作时可以直接从缓存中提取结果,有效降低检索操作的时延,提升检索数据时的 ...
- Python——Html(语法、格式、段落、文字处理、路径、超链接、图片、视频)
HTML(Hyper Text Markup Language超文本标记语言)用特殊的一种标签把需要特殊展示出来的内容圈起来.这就是标记语言语法规则 <标记>被标记的内容</标记&g ...
- Python 潮流周刊第 34 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- kafka源码阅读之MacBook Pro M1搭建Kafka2.7版本源码运行环境
原创/朱季谦 最近在阅读Kafka的源码,想可以在阅读过程当中,在代码写一些注释,便决定将源码部署到本地运行. 日常开发过程中,用得比较多一个版本是Kafka2.7版本,故而在MacBook Pro笔 ...
- Java开发手册精华总结
阿里 Java 开发手册的思考总结 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上. -- 毕玄 1. 命名风格 [书摘]类名用 UpperCamelC ...
- AIGC的阿克琉斯之踵
摘要:现在,越来越多的企业和个人使用AIGC生成文章.图片.音乐甚至视频等内容,AIGC已经成为一种必备的工具.在游戏和原画师行业,甚至已经出现了第一批因为AI而失业的人. 本文分享自华为云社区< ...
- 聊聊Java的异常机制问题
摘要:java异常指在程序运行时可能出现的一些错误,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流. 本文分享自华为云社区<Ja ...
- 一文带你梳理Clang编译步骤及命令
摘要: 本文简单介绍了Clang编译过程中涉及到的步骤和每个步骤的产物,并简单分析了部分影响预处理和编译成功的部分因素. 本文分享自华为云社区<Clang编译步骤及命令梳理>,作者:mai ...
- git clone 出现fatal: unable to access ‘https://github 错误解决方法
git clone 遇到问题:fatal: unable to access 'https://github.comxxxxxxxxxxx': Failed to connect to xxxxxxx ...
- 总结MySQL 的一些知识点:MySQL 连接的使用
MySQL 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JOIN ...