循序渐进学.Net Core Web Api开发系列【17】:.Net core自动作业之Hangfire
nuget搜索:Hangfire
安装即可,这里我选择的是 1.7.0-beta1 版本
我是用这个集成到了 mvc api里
这里需要在 Startup 文件里进行如下配置
在配置方法 ConfigureServices 里配置数据库,这是用的是sqlserver数据库初始化
var hangfireConnStr = _configuration["AppSettings:HangfireConnectionString"];
services.AddHangfire(configuration => configuration.UseSqlServerStorage(hangfireConnStr));
如果数据库是mysql,使用下面语句初始化,需要引用 Hangfire.MySql

var hangfireMysqlConnStr = _configuration["AppSettings:HangfireMysqlConnectionString"];
services.AddHangfire(configuration => configuration.UseStorage(
new MySqlStorage(
hangfireMysqlConnStr,
new MySqlStorageOptions
{
TransactionIsolationLevel = IsolationLevel.ReadCommitted,
QueuePollInterval = TimeSpan.FromSeconds(),
JobExpirationCheckInterval = TimeSpan.FromHours(),
CountersAggregateInterval = TimeSpan.FromMinutes(),
PrepareSchemaIfNecessary = true,
DashboardJobListLimit = ,
TransactionTimeout = TimeSpan.FromMinutes(),
TablesPrefix = ""
})));

在配置方法 Configure 里需要配置下管理员后台
app.UseHangfireServer();
app.UseHangfireDashboard();
这样我们就可以通过后台操作管理作业了
地址如下
https://localhost:5001/hangfire

这里可以看到正在跑的作业和执行情况

不过这个后台只能在服务器本机上访问,为了保证安全,无法通过域名访问操作
添加调用代码很简单,在每次系统启动的时候,配置如下,如果没有添加;有了就更新
RecurringJob.AddOrUpdate(() => UpdateMerchIndex(), Cron.MinuteInterval());
这里是指每隔三分钟调用一次 UpdateMerchIndex() 方法。
是不是很简单呢
数据库需要初始化几个表

这里附送数据库初始化建表SQL语句
sqlserver
USE [GEDU_Hangfire]
GO
/****** Object: Table [HangFire].[Job] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Job](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[StateId] [bigint] NULL,
[StateName] [nvarchar](20) NULL,
[InvocationData] [nvarchar](max) NOT NULL,
[Arguments] [nvarchar](max) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_Job] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Hash] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Hash](
[Key] [nvarchar](100) NOT NULL,
[Field] [nvarchar](100) NOT NULL,
[Value] [nvarchar](max) NULL,
[ExpireAt] [datetime2](7) NULL,
CONSTRAINT [PK_HangFire_Hash] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[Field] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Counter] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Counter](
[Key] [nvarchar](100) NOT NULL,
[Value] [int] NOT NULL,
[ExpireAt] [datetime] NULL
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[AggregatedCounter] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[AggregatedCounter](
[Key] [nvarchar](100) NOT NULL,
[Value] [bigint] NOT NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_CounterAggregated] PRIMARY KEY CLUSTERED
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Set] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Set](
[Key] [nvarchar](100) NOT NULL,
[Score] [float] NOT NULL,
[Value] [nvarchar](256) NOT NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_Set] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[Value] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Server] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Server](
[Id] [nvarchar](100) NOT NULL,
[Data] [nvarchar](max) NULL,
[LastHeartbeat] [datetime] NOT NULL,
CONSTRAINT [PK_HangFire_Server] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Schema] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Schema](
[Version] [int] NOT NULL,
CONSTRAINT [PK_HangFire_Schema] PRIMARY KEY CLUSTERED
(
[Version] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[List] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[List](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Key] [nvarchar](100) NOT NULL,
[Value] [nvarchar](max) NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_List] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[JobQueue] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[JobQueue](
[Id] [int] IDENTITY(1,1) NOT NULL,
[JobId] [bigint] NOT NULL,
[Queue] [nvarchar](50) NOT NULL,
[FetchedAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_JobQueue] PRIMARY KEY CLUSTERED
(
[Queue] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[State] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[State](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[JobId] [bigint] NOT NULL,
[Name] [nvarchar](20) NOT NULL,
[Reason] [nvarchar](100) NULL,
[CreatedAt] [datetime] NOT NULL,
[Data] [nvarchar](max) NULL,
CONSTRAINT [PK_HangFire_State] PRIMARY KEY CLUSTERED
(
[JobId] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[JobParameter] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[JobParameter](
[JobId] [bigint] NOT NULL,
[Name] [nvarchar](40) NOT NULL,
[Value] [nvarchar](max) NULL,
CONSTRAINT [PK_HangFire_JobParameter] PRIMARY KEY CLUSTERED
(
[JobId] ASC,
[Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_HangFire_JobParameter_Job] Script Date: 01/22/2019 14:16:29 ******/
ALTER TABLE [HangFire].[JobParameter] WITH CHECK ADD CONSTRAINT [FK_HangFire_JobParameter_Job] FOREIGN KEY([JobId])
REFERENCES [HangFire].[Job] ([Id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [HangFire].[JobParameter] CHECK CONSTRAINT [FK_HangFire_JobParameter_Job]
GO
/****** Object: ForeignKey [FK_HangFire_State_Job] Script Date: 01/22/2019 14:16:29 ******/
ALTER TABLE [HangFire].[State] WITH CHECK ADD CONSTRAINT [FK_HangFire_State_Job] FOREIGN KEY([JobId])
REFERENCES [HangFire].[Job] ([Id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [HangFire].[State] CHECK CONSTRAINT [FK_HangFire_State_Job]
GO
mysql
/*
Navicat Premium Data Transfer Source Server : mysql47.93.198.115
Source Server Type : MySQL
Source Server Version : 50562
Source Host : 47.93.198.115:3306
Source Schema : gedu_hangfire Target Server Type : MySQL
Target Server Version : 50562
File Encoding : 65001 Date: 22/01/2019 14:17:37
*/ SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0; -- ----------------------------
-- Table structure for aggregatedcounter
-- ----------------------------
DROP TABLE IF EXISTSaggregatedcounter;
CREATE TABLEaggregatedcounter(
Idint(11) NOT NULL AUTO_INCREMENT,
</span><span style="color: #0000ff;">Key</span>varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Valueint(11) NOT NULL,
ExpireAtdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE,
UNIQUE INDEXIX_CounterAggregated_Key(<span style="color: #0000ff;">Key</span><span style="color: #000000;">) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3482 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for counter
-- ----------------------------
DROP TABLE IF EXISTScounter;
CREATE TABLEcounter(
Idint(11) NOT NULL AUTO_INCREMENT,
</span><span style="color: #0000ff;">Key</span>varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Valueint(11) NOT NULL,
ExpireAtdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE,
INDEXIX_Counter_Key(<span style="color: #0000ff;">Key</span><span style="color: #000000;">) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17107 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for distributedlock
-- ----------------------------
DROP TABLE IF EXISTSdistributedlock;
CREATE TABLEdistributedlock(
Resourcevarchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
CreatedAtdatetime NOT NULL
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for hash
-- ----------------------------
DROP TABLE IF EXISTShash;
CREATE TABLEhash(
Idint(11) NOT NULL AUTO_INCREMENT,
</span><span style="color: #0000ff;">Key</span>varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Fieldvarchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Valuelongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,
ExpireAtdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE,
UNIQUE INDEXIX_Hash_Key_Field(<span style="color: #0000ff;">Key</span><span style="color: #000000;">,Field) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 29028 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for job
-- ----------------------------
DROP TABLE IF EXISTSjob;
CREATE TABLEjob(
Idint(11) NOT NULL AUTO_INCREMENT,
StateIdint(11) NULL DEFAULT NULL,
StateNamevarchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
InvocationDatalongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Argumentslongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
CreatedAtdatetime NOT NULL,
ExpireAtdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE,
INDEXIX_Job_StateName(StateName) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5703 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for jobparameter
-- ----------------------------
DROP TABLE IF EXISTSjobparameter;
CREATE TABLEjobparameter(
Idint(11) NOT NULL AUTO_INCREMENT,
JobIdint(11) NOT NULL,
Namevarchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Valuelongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,
PRIMARY KEY (Id) USING BTREE,
UNIQUE INDEXIX_JobParameter_JobId_Name(JobId,Name) USING BTREE,
INDEXFK_JobParameter_Job(JobId) USING BTREE,
CONSTRAINTFK_JobParameter_JobFOREIGN KEY (JobId) REFERENCESjob(Id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB AUTO_INCREMENT = 17107 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for jobqueue
-- ----------------------------
DROP TABLE IF EXISTSjobqueue;
CREATE TABLEjobqueue(
Idint(11) NOT NULL AUTO_INCREMENT,
JobIdint(11) NOT NULL,
Queuevarchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
FetchedAtdatetime NULL DEFAULT NULL,
FetchTokenvarchar(36) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE,
INDEXIX_JobQueue_QueueAndFetchedAt(Queue,FetchedAt) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5703 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for jobstate
-- ----------------------------
DROP TABLE IF EXISTSjobstate;
CREATE TABLEjobstate(
Idint(11) NOT NULL AUTO_INCREMENT,
JobIdint(11) NOT NULL,
Namevarchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Reasonvarchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
CreatedAtdatetime NOT NULL,
Datalongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,
PRIMARY KEY (Id) USING BTREE,
INDEXFK_JobState_Job(JobId) USING BTREE,
CONSTRAINTFK_JobState_JobFOREIGN KEY (JobId) REFERENCESjob(Id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for list
-- ----------------------------
DROP TABLE IF EXISTSlist;
CREATE TABLElist(
Idint(11) NOT NULL AUTO_INCREMENT,
</span><span style="color: #0000ff;">Key</span>varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Valuelongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,
ExpireAtdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for server
-- ----------------------------
DROP TABLE IF EXISTSserver;
CREATE TABLEserver(
Idvarchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Datalongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
LastHeartbeatdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for set
-- ----------------------------
DROP TABLE IF EXISTS<span style="color: #0000ff;">set</span><span style="color: #000000;">;
CREATE TABLE<span style="color: #0000ff;">set</span><span style="color: #000000;">(
Idint(11) NOT NULL AUTO_INCREMENT,
</span><span style="color: #0000ff;">Key</span>varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Valuevarchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Scorefloat NOT NULL,
ExpireAtdatetime NULL DEFAULT NULL,
PRIMARY KEY (Id) USING BTREE,
UNIQUE INDEXIX_Set_Key_Value(<span style="color: #0000ff;">Key</span><span style="color: #000000;">,Value) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 95 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------
-- Table structure for state
-- ----------------------------
DROP TABLE IF EXISTSstate;
CREATE TABLEstate(
Idint(11) NOT NULL AUTO_INCREMENT,
JobIdint(11) NOT NULL,
Namevarchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
Reasonvarchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
CreatedAtdatetime NOT NULL,
Datalongtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,
PRIMARY KEY (Id) USING BTREE,
INDEXFK_HangFire_State_Job(JobId) USING BTREE,
CONSTRAINTFK_HangFire_State_JobFOREIGN KEY (JobId) REFERENCESjob(Id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB AUTO_INCREMENT = 17108 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1;
redis配置(Startup.cs 文件里的 ConfigureServices)

//注入Hangfire服务 redis
var hangfireRedisConnStr = Configuration["AppSettings:HangfireRedisConnectionString"];
_redis = ConnectionMultiplexer.Connect(hangfireRedisConnStr);
var prefix = Configuration["AppSettings:HangfireRedisPrefixName"];
var option = new RedisStorageOptions
{
Prefix = prefix,
Db = ,
};
if (int.TryParse(Configuration["AppSettings:HangfireRedisDefaultDatabse"], out int dfaultdb))
{
if (dfaultdb >= && dfaultdb <= )
{
option.Db = dfaultdb;
}
}
services.AddHangfire(config => config.UseRedisStorage(_redis, option));

配置文件
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"AppSettings": {
"HangfireRedisConnectionString": "127.0.0.1:6379,password=,defaultDatabase=1,ssl=false,writeBuffer=10240",
"HangfireRedisPrefixName": "{hangfire_muniumini}:",
"HangfireRedisDefaultDatabse": "",
"RedisConnectionString": "127.0.0.1:6379,password=,defaultDatabase=1,poolsize=50,ssl=false,writeBuffer=10240",
"UseSwagger": "true"
},
"AllowedHosts": "*"
}
其中AppSetting里的配置说明
HangfireRedisConnectionString(连接字符串,格式参考上面的配置文件)
HangfireRedisPrefixName(redis的字典集名称)
HangfireRedisDefaultDatabse(redis默认数据库序号)
搞定
循序渐进学.Net Core Web Api开发系列【17】:.Net core自动作业之Hangfire的更多相关文章
- 循序渐进学.Net Core Web Api开发系列【0】:序言与目录
一.序言 我大约在2003年时候开始接触到.NET,最初在.NET framework 1.1版本下写过代码,曾经做过WinForm和ASP.NET开发.大约在2010年的时候转型JAVA环境,这么多 ...
- 循序渐进学.Net Core Web Api开发系列【16】:应用安全续-加密与解密
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 应用安全除 ...
- 循序渐进学.Net Core Web Api开发系列【15】:应用安全
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍W ...
- 循序渐进学.Net Core Web Api开发系列【14】:异常处理
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍异 ...
- 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- 循序渐进学.Net Core Web Api开发系列【12】:缓存
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- 循序渐进学.Net Core Web Api开发系列【11】:依赖注入
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- 循序渐进学.Net Core Web Api开发系列【10】:使用日志
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇介 ...
- 循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇描述一 ...
- 循序渐进学.Net Core Web Api开发系列【8】:访问数据库(基本功能)
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇讨论如 ...
随机推荐
- 初识Flink-从WorldCount开始
Apache Flink是一个用于分布式流和批处理数据处理的开源平台.Flink的核心是流数据流引擎,为数据流上的分布式计算提供数据分发,通信和容错.Flink在流引擎之上构建批处理,覆盖本机迭代支持 ...
- RabbitMq--2--安装
简单说下个人的理解,mq就是一个消息代理,负责异步消息转发,可以很大程度缓解服务器压力,并且防止服务器宕机影响业务等. 安装: 环境:centos7 1).首先需要安装erlang #wget htt ...
- SQL数据库—<7>事务、异常和游标
事务 一.什么是事务能够保证数据的一致性的代码控制,要么执行提交,要么滚回事务的初始状态 二.事务的四大特性:ACIDA:原子性-------事务不可拆开,要么执行要么回滚无中间状态C:一致性---- ...
- SVN版本管理 目录结构
一. SVN标准目录 Subversion有一个很标准的目录结构,是这样的.比如项目是 proj,svn地址为 svn://proj/,那么标准的 svn 布局是: 这是一个标准的布局,trunk为主 ...
- linux c 链接详解1-多目标文件链接
1. 多目标文件的链接 摘自:linux c编程一站式学习 http://learn.akae.cn/media/index.html 可以学会在linux下将多个c语言文件一起编译. 现在我们把例 ...
- SourceTree 这是一个无效源路径/URL的 解决方法
看网上的教程都解决不了,这是一个大坑,折腾了很久. 如果说你的项目存在,而不是url真的无效,那就是因为你的权限问题. 因为你的sourcetree登过其他账号,在sourceTree设置里面记录了他 ...
- linux用户的基本操作2 用户密码管理
目录 linux系统的基本用户操作2 用户的扩展知识 用户密码管理 linux系统的基本用户操作2 3)使用userdel删除账户 语法 : userdel [-r] username -r 同时删除 ...
- 【vlfeat】O(n)排序算法——计数排序
今天想在网上找一个实现好的er算法来着,没啥具体的资料,无奈只能看vlfeat的mser源码,看能不能修修补补实现个er. 于是,看到某一段感觉很神奇,于是放下写代码,跑来写博客,也就是这段 /* - ...
- dosbox下载并配置BC3.1及环境变量的方法
https://www.tuicool.com/articles/v2A3mm--Win8下用DOSBox编写汇编语言 http://www.dosbox.com/ http://www.masm32 ...
- Hashtable、HashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11444013.html 并发场景下的Map容器使用场景 如果对数据有强一致要求,则需使用Hashtab ...