分布式锁

在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. 现代 CMake 模块化项目管理指南

    现代 CMake 模块化项目管理指南 参考小彭老师的视频教程整理笔记,学习同时方便快速查阅,视频链接如下 [公开课]现代 CMake 模块化项目管理指南[C/C++] 对应课程 PPT 和源码见 ht ...

  2. 聊聊 从源码来看ChatGLM-6B的模型结构

    基于ChatGLM-6B第一版,要注意还有ChatGLM2-6B以及ChatGLM3-6B 概述 ChatGLM是transformer架构的神经网络模型,因此从transformer结构入手,分析其 ...

  3. 确定了-C#是2023年度的编程语言!

    大家好,我是沙漠尽头的狼.在朋友圈看到桂素伟大佬发的喜讯截图,站长赶紧翻译向大家报喜,确定了-C#是2023年度的编程语言! 在TIOBE指数的历史上,C#首次获得了年度编程语言的奖项.祝贺!二十多年 ...

  4. 使用 PostgreSQL 实现 PageRank

    PageRank 算法 ​ 作为 Google 最早的一个网页排名算法,该算法在早期的搜索引擎中是搜索结果最为准确的,同时也是 Google 发家的一个重要算法.尽管这些年来该算法不再是 Google ...

  5. Golang代码测试:一点到面用测试驱动开发

    摘要:TDD(Test Driven Development),测试驱动开发.期望局部最优到全局最优,这个是一种非常不错的好习惯. 了解Golang的测试之前,我们先了解一下go语言自带的测试工具. ...

  6. 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了

    摘要:充电团聚云上见,顺便攒攒压岁钱. 春!节!倒!计!时!啦! 农历新年即将到来,热闹的过年氛围逐渐弥漫,华为云社区先给大家拜个早年,祝所有小伙伴们新春快乐,牛年大吉! 回望2020年,社区涌现了许 ...

  7. Java开发如何通过IoT边缘ModuleSDK进行进程应用的开发?

    摘要:为解决用户自定义处理设备数据以及自定义协议设备快速接入IOT平台的诉求,华为IoT边缘提供ModuleSDK,用户可通过集成SDK让设备以及设备数据快速上云. 本文分享自华为云社区<[华为 ...

  8. 华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案

    摘要:企业数字化转型如火如荼,云成为数字化与新基建的关键要素,数据成为智能时代新的生产资料和企业数字化的生命,而数据库则是支撑数据生命线的底座. 本文分享自华为云社区<华为中国生态大会2021举 ...

  9. 云小课 | SA基线检查—给云服务的一次全面“体检”

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 华为云态势感知( ...

  10. 一通百通,带你一次性全理解Spring 中的Template

    摘要:Template定义了问题的边界,子类定义了具体的实现,只要在模板的范围内玩耍就可以了. 本文分享自华为云社区<Spring 中的Template一次全理解,解析问题的本质>,作者: ...