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之Create index API
创建指定名称的index. 命令样例如下: curl -X PUT "https://localhost:9200/testindex_002?pretty" -H 'Conten ...
- ElasticSearch之Slow Log
ElasticSearch的慢日志,相关的参数及配置方法. 在log4j2.properties中配置慢日志的输出文件名. Search Slow Log 相关参数 index.search.slow ...
- HTTP安全头部对jsp页面不生效
本文于2016年4月底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 诡异的问题 AppScan扫描报告中提示,Web服务器返回js.cs ...
- Spring Boot入坑-2-第一个Spring Boot项目
Spring Boot简介 自从2014年4月Pivotal团队推出以来,作为一个基于Spring的开源轻量级框架,备受企业级应用喜爱 简化Spring应用的搭建与开发过程 是对Spring缺点进行的 ...
- Ocelot(.NET API Gateway)
一.介绍 Ocelot 是一个.NET API 网关 面向使用.NET运行微服务/面向服务的体系结构的人员,这些体系结构需要统一的系统入口点. Ocelot将HttpRequest对象操作到由其配置指 ...
- Rasa中的tracker_store和event_broker
Rasa 中的 tracker_store 相对主流为 Redis,event_broker 相对主流为 RabbitMQ.后续为了研究学习直接将 tracker_store 和 event_br ...
- 超详细API插件使用教程,教你开发AI垃圾分类机器人
本文分享自华为云社区[案例教学]华为云API对话机器人的魅力-体验AI垃圾分类机器人,作者:华为云PaaS服务小智. 体验用Huawei Cloud API开发AI垃圾分类机器人,并学习AI自然语言的 ...
- GaussDB技术解读丨数据库迁移创新实践
本文分享自华为云社区<DTCC 2023专家解读丨GaussDB技术解读系列之数据库迁移创新实践>,作者:GaussDB 数据库. 近日,以"数智赋能 共筑未来"为主题 ...
- 云小课 | 一分钟了解AppCube中的应用
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:应用魔方(AppC ...
- 鲲鹏基础软件开发赛道openLooKeng赛题火热报名中,数十万大奖等您来收割
随着云计算.物联网.移动计算.智慧城市.人工智能等领域的发展,各类应用对大数据处理的需求也发生着变化.以实时分析.离线分析.交互式分析等为代表的计算引擎逐渐为各大企业行业发展所看重.作为鲲鹏产业生态的 ...