使用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 ...
随机推荐
- 命令行的操作——cd
初学命令行,总是提示找不到有关的文件,当时的我啥也不知道,最后就很惨,啥也找不到 后来就只好自己上网找资料了 以下博文改编自小佳的博客 在需要处理不同路径下的文件的时候,经常要在命令行模式下切换目录, ...
- php 设计模式之策略者模式
<?php header('Content-Type:text/html;charset=utf-8'); /** * 策略模式演示代码 * * 为了更好地突出“策略”,我们这里以出行为例演示, ...
- nginx调整large_client_header_buffers
https://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers Syntax: large_c ...
- python3转义编码
s = 'dy电影' print(s) # dy电影 print(type(s)) # <class 'str'> print(s.encode('utf-8')) # b'dy\xe7\ ...
- 深入理解JVM - 垃圾收集器
垃圾回收主要是要解决3件事情: 那些内存需要回收? 如何回收? 什么时候回收? 那些内存需要回收 在强引用的情况下已经“死”了的对象就需要回收,在非强引用的情况下视情况回收.在java里面,几乎所有的 ...
- PAT Advanced 1154 Vertex Coloring (25) [set,hash]
题目 A proper vertex coloring is a labeling of the graph's vertices with colors such that no two verti ...
- winEdt打开tex文件报错解决方法
写论文真的是不断遇到各种困难啊,这个Latex软件就很多,好不容易中个A1区的文章,期刊说更新了新的模板就下载了,忽然发现打开有reading error,看不到一点内容,神奇的是竟然可以运行.这样的 ...
- Linux-竟态初步引入
(1).竟态全称是:竞争状态,多进程环境下,多个进程同时抢占系统资源(内存.CPU.文件IO). (2).竞争状态对于操作系统OS来说是很危险的,此时的操作系统OS如果没有处理好就会造成结果不确定. ...
- python获取当前的日期和时间
import datetime import time print ("格式参数:") print (" %a 星期几的简写") print (" % ...
- Python——气象数据分析
将对意大利北部沿海地区的气象数据进行分析与可视化.我们在实验过程中先会运用 Python 中 matplotlib 库的对数据进行图表化处理,然后调用 scikit-learn 库当中的的 SVM 库 ...