使用Hangfire MVC 做排程
所使用的是 Hangfire 強大排程器有 UI介面可以使用。
首先安裝PM> Install-Package Hangfire
安裝這個包含安裝Hangfire所有的相關環境了 類似Hangfire Sql Server Hangfire.Core….
install
在來是設定 IIS 因為是使用IIS站台。
請在你的IIS 應用程式集區找到您所使用的站台接下來點選 =>
進階設定找到啟動模式(Start Mode) 改成 AlwaysRunning模式。
也要把站台的進階設定,預先載入已啟動,改為True否則AlwaysRunning會沒有效果的。
接下來要在程式設定 IIS站台永遠執行模式
在程式Create ApplicationPreload.cs
#讓 IIS 處在啟動狀態 要從 IIS 設定 PreLoad(預先載用) = true 進階設定 接下來在應用程式集區 進階設定 啟動模式選擇 AlwaysRunning
#接下來要到 C:WindowsSystem32inetsrvconfigapplicationHost.config 設定
#查看 applicationPools 的 startMode 是否為 AlwaysRunning
<site name = "testsite" id="2" serverAutoStart="true">
<application path = "/" applicationPool="testsite" preloadEnabled="true" serviceAutoStartProvider="ApplicationPreload">
<virtualDirectory path = "/" physicalPath="D:testsite" />
</application>
<binding protocol = "http" bindingInformation="*:5:" /></bindings>
</site>
#接下來複製貼上以下文字 在 system.applicationHost內 sites範圍外面
<!-- Just AFTER closing the `sites` element AND AFTER `webLimits` tag -->
<serviceAutoStartProviders>
<add name = "ApplicationPreload" type="ExampleService.AgentService.ApplicationPreload, ExampleService.AgentService" />
<serviceAutoStartProviders>
In ApplicationPreload.cs
public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
Startup.Instance.Start();
}
}
在global.asax.cs裡啟動Hangfire
public class Global : HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
Startup.Instance.Start();
}
protected void Application_End(object sender, EventArgs e)
{
Startup.Instance.Stop();
}
}
需建立完全同名 Startup.cs 因Hangfire會先到這取得 Configuration 資訊
使用Owin環境設定
[assembly: OwinStartup(typeof(AgentService.Startup))]
namespace AgentService
{
public class Startup : IRegisteredObject
{
public static readonly Startup Instance = new Startup();
private readonly object _lockObject = new object();
private bool _started;
private BackgroundJobServer _backgroundJobServer;
/// <summary>
/// 一開始所要執行的 初始化 Hangfire
/// 會先尋找資料庫是否有被初始化再來則是這邊 如果一開始不先初始化資料庫直接 啟動 UseHangfireServer會產生
/// 錯誤
/// </summary>
/// <param name="app"></param>
public void Configuration(IAppBuilder app)
{
//啟用Hangfire的Dashboard
//預設 Dashboard 路徑為http://localhost:xxxx/hangfire
//使用 Dashboard,可以設定顯示 dashboard 的 path http://localhost:xxxx/HangfireDashboard
//在這設定能進入Dashboard 得權限
app.UseHangfireDashboard("/HangfireDashboard", new DashboardOptions
{
Authorization = new[] { new HangfireDashBoardAuthorizationFilter() },
});
//執行所需的 排程
StartMyTask();
}
}
Cron 的時間設定說明
Cron時間計算
Cron 詳細解說
/// <summary>
/// 執行的 Method 參數最好是字串,如果是物件的話,不要是 nested 物件,這樣會Parse不出來,然後報錯哦!
/// 使用 Hangfire 去執行的話, nested obj 會 parse 不出來,所以用字串傳遞
/// </summary>
private void StartMyTask()
{
//設定每天的幾十幾分運作
//Cron.Daily(07,30)
//同上
//分鐘 小時 日期 月份 週
//30 07 * * *
//代表這個域上包含所有合法的值
//以下方做為表示是說每天07:30 AM執行此排程
string cronExp = "30 07 * * *";
//設定注意 這就是所謂的固定時間去做排程定時
//第一參數為 RecurringJobId
//第二為 你要所使用的call method
//第三 就是你要這排程何時運作
//第四 很重要!! 他會依你的排程時間下去實作但你需要將此時間設定為Local否則預設是 UTC你會不知道何時運作
RecurringJob.AddOrUpdate("test", () => AgentService.SetDEMOamount(), cronExp,Ti meZoneInfo. Local);
//這是需要在長時間 背景執行的工作就可以設定這個
BackgroundJob.大专栏 使用Hangfire MVC 做排程>Enqueue(() => AgentService.SetDEMOamount());
//BackgroundJob.Schedule()將目前的任務延後執行,在送入背景等待時就已經執行完畢,而不是3秒後才被執行。
BackgroundJob.Schedule(() => AgentService.SetDEMOamount()),TimeSpan.FromSeconds(3));
//使用下列方法 他會馬上執行此排程但不會紀錄這次的使用
RecurringJob.Trigger("test");
}
/// <summary>
/// 一開始從 Global.aspx會啟動這邊 直接開啟 Hangfire 與 JobStorage資料庫連接
/// </summary>
public void Start()
{
lock (_lockObject)
{
if (_started) return;
_started = true;
HostingEnvironment.RegisterObject(this);
JobStorage.Current = new SqlServerStorage(ConnectionString);
GlobalConfiguration.Configuration.UseSqlServerStorage(ConnectionString);
// 建立Background JobSserver 來處理 Job
// 啟用HanfireServer
// reduce the heartbeat of the Hangfire dashboard. It is taking too much of our CPU usag e.It is in our production also
_backgroundJobServer = new BackgroundJobServer(new BackgroundJobServerOptions
{
//要處理的陣列列表
Queues = new[] { "test" },
//巡迴訪問時間越長 將會很耗CPU的效能
//預設30秒 6分鐘為 使用 TransactionScope 限制時間
HeartbeatInterval = new TimeSpan(0, 6, 0),
ServerCheckInterval = new TimeSpan(0, 6, 0),
//預設詢問Job是 15 秒,也可以依狀況來調整,如下我使用6分鐘
SchedulePollingInterval = new TimeSpan(0, 6, 0),
//服務名稱
ServerName = "FundaySaleshangfireahent",
//設定 Hangfire 同一時間,可以處理多少的 Job 現在是20
//預設是 處理器數目 * 5
WorkerCount = Environment.ProcessorCount * 5,
});
}
}
/// <summary>
/// 程序停止
/// </summary>
public void Stop()
{
lock (_lockObject)
{
if (_backgroundJobServer != null)
{
_backgroundJobServer.Dispose();
}
HostingEnvironment.UnregisterObject(this);
}
}
void IRegisteredObject.Stop(bool immediate)
{
Stop();
}
}
排程權限設定
/// <summary>
/// 取得能進入 Hangfire Dashboard的人員 只有管理者權限才能進入
/// </summary>
public class HangfireDashBoardAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize([NotNull]DashboardContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
var owinContext = new Microsoft.Owin.OwinContext(context.GetOwinEnvironment());
if (owinContext.Authentication.User.Identity.IsAuthenticated)
{
return true;
}
return false;
}
}
參考資源
Related Posts
Please enable JavaScript to view the comments powered by Disqus.
使用Hangfire MVC 做排程的更多相关文章
- 利用 crontab 來做 Linux 固定排程
crontab 介紹 crontab 是 Linux 內建的機制,可以根據設置的時間參數來執行例行性的工作排程. 上述這張圖可以清楚的顯示出前五項參數應該要帶進去的數字.依序是分鐘, 小時, 日期, ...
- crontab 例行性排程
那么我们就来聊一聊 crontab 的语法吧![root@www ~]# crontab [-u username] [-l|-e|-r]选项不参数:-u :只有 root 才能迚行这个仸务,亦即帮其 ...
- 例行性工作排程 (crontab)
1. 什么是例行性工作排程 1.1 Linux 工作排程的种类: at, crontab 1.2 Linux 上常见的例行性工作2. 仅运行一次的工作排程 2.1 atd 的启动与 at 运行的方式: ...
- Linux Kernel 排程機制介紹
http://loda.hala01.com/2011/12/linux-kernel-%E6%8E%92%E7%A8%8B%E6%A9%9F%E5%88%B6%E4%BB%8B%E7%B4%B9/ ...
- 浅尝一个排程引擎Optaplanner,前序。
当码农有10多年了,由建筑行业软件,各种MIS,通用物流定制平台,CCTV客户端(是闭路电视,不是央视喔)啥都做过.最后小试一下创业,不过那都是闹着玩的,不到一年就回到码农的队列,重拾搬砖的行当.近些 ...
- 【原】无脑操作:HTML5 + CSS + JavaScript实现比赛排程
1.背景:朋友请帮忙做一个比赛排程软件 2.需求: ① 比赛人数未知,可以通过文本文件读取参赛人员名称: ② 对参赛人员随机分组,一组两人,两两PK,如果是奇数人数,某一个参赛人员成为幸运儿自动晋级: ...
- 易普优APS与国外知名高级计划排程系统对比
众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...
- 更快的速度、更好的服务——易普优APS云排程
众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...
- [转][SQL] SSIS 简单应用 数据库汇入导出设定& SQL Agent定期排程
前言 本篇不是要說高深的SSIS 技巧,而是用實例的方式,說明如何應用 Visual Studio 的「Business Intelligence Projects」來建立「Integration S ...
随机推荐
- 永久使用mybase
(1)关闭程序 (2)找到程序的安装路径:D:\mybase\mybase\nyfedit7pro (3)打开mybase.ini 文件,7以下版本文件名称为nyfedit.ini
- jquery如何获取div下ul的某个li
$('div ul').each(function(){ alert($(this).find('li').eq(x)) }) $("div ul li:eq(1)")// $(& ...
- 计蒜客 置换的玩笑(DFS)
传送门 题目大意: 小蒜头又调皮了.这一次,姐姐的实验报告惨遭毒手. 姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔.但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数 ...
- ruoyi LogUtils
package com.ruoyi.framework.util; import java.io.PrintWriter; import java.io.StringWriter; import ja ...
- 吴裕雄--天生自然 PYTHON3开发学习:字符串
var1 = 'Hello World!' var2 = "Runoob" #!/usr/bin/python3 var1 = 'Hello World!' var2 = &quo ...
- 884A. Book Reading#抽空学习好孩子(模拟)
题目出处:http://codeforces.com/problemset/problem/884/A 题目大意:每天时间分两部分,工作和学习,工作优先,闲暇读书,问第几天读完 #include< ...
- abstract关键字、final关键字、static关键字、访问修饰符详解
abstract关键字.final关键字.static关键字.访问修饰符详解 abstract关键字: final关键字: static关键字: 访问修饰符:
- Python文件基本操作及上下文管理
文件基本操作 打开文件:f = open(fole_name,mode = 'r'),传入表示文件路径的字符串,会返回一个文件对象,mode是文件打开模式. 关闭文件:f.close(),调用给定文件 ...
- Opencv笔记(七)——访问与操作像素
一.获取矩阵的元素 1.获取三维矩阵img[i,j]处的元素 (b,g,r) = image[i,j],image大小为:MxNxK. 2.获取三维矩阵的子矩阵的全部元素 newimage = ima ...
- vue打包成app后,背景图片不显示
问题: 在使用npm run build 打包后, 如果在页面中使用img标签引入,打包后的路径是由index.html开始访问的,真正访问的是Static/img/图片名, 是正确的, 但是写在cs ...