Greg Yang

Developer


Taipei, Taiwan

108
POSTS

35

TAGS

所使用的是 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 做排程的更多相关文章

  1. 利用 crontab 來做 Linux 固定排程

    crontab 介紹 crontab 是 Linux 內建的機制,可以根據設置的時間參數來執行例行性的工作排程. 上述這張圖可以清楚的顯示出前五項參數應該要帶進去的數字.依序是分鐘, 小時, 日期, ...

  2. crontab 例行性排程

    那么我们就来聊一聊 crontab 的语法吧![root@www ~]# crontab [-u username] [-l|-e|-r]选项不参数:-u :只有 root 才能迚行这个仸务,亦即帮其 ...

  3. 例行性工作排程 (crontab)

    1. 什么是例行性工作排程 1.1 Linux 工作排程的种类: at, crontab 1.2 Linux 上常见的例行性工作2. 仅运行一次的工作排程 2.1 atd 的启动与 at 运行的方式: ...

  4. 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/ ...

  5. 浅尝一个排程引擎Optaplanner,前序。

    当码农有10多年了,由建筑行业软件,各种MIS,通用物流定制平台,CCTV客户端(是闭路电视,不是央视喔)啥都做过.最后小试一下创业,不过那都是闹着玩的,不到一年就回到码农的队列,重拾搬砖的行当.近些 ...

  6. 【原】无脑操作:HTML5 + CSS + JavaScript实现比赛排程

    1.背景:朋友请帮忙做一个比赛排程软件 2.需求: ① 比赛人数未知,可以通过文本文件读取参赛人员名称: ② 对参赛人员随机分组,一组两人,两两PK,如果是奇数人数,某一个参赛人员成为幸运儿自动晋级: ...

  7. 易普优APS与国外知名高级计划排程系统对比

    众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...

  8. 更快的速度、更好的服务——易普优APS云排程

    众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...

  9. [转][SQL] SSIS 简单应用 数据库汇入导出设定& SQL Agent定期排程

    前言 本篇不是要說高深的SSIS 技巧,而是用實例的方式,說明如何應用 Visual Studio 的「Business Intelligence Projects」來建立「Integration S ...

随机推荐

  1. Python说文解字_杂谈08

    1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对 ...

  2. 基于SpringBoot框架企业级应用系统开发全面实战

    Eclipse 安装spring-tool-suite教程,并创建一个新的springboot项目 使用SpringBoot构建项目,加载SSM整合的applicationContext.xml的注解 ...

  3. PAT Advanced 1033 To Fill or Not to Fill (25) [贪⼼算法]

    题目 With highways available, driving a car from Hangzhou to any other city is easy. But since the tan ...

  4. 如何正确理解SQL关联子查询

    一.基本逻辑 对于外部查询返回的每一行数据,内部查询都要执行一次.在关联子查询中是信息流是双向的.外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录.然后,外部查询根据 ...

  5. 1. Ruby基础知识

    1. Ruby执行选项 符号 作用 -c 检查代码正确性 -w 警告模式运行 -e 字面脚本 -l 行模式运行 单独 ruby -c Hello.rb 组合 ruby -le 'print " ...

  6. Linux下自由切换用户

    切换用户的命令是su,su是(switch user)切换用户的缩写.通过su命令,可以从普通用户切换到root用户,也可以从root用户切换到普通用户. 上述图中是linux下的终端页面,其中pyv ...

  7. 实践一次有趣的sql优化

    课程表 #课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 增加 100 条数据 #增加课程表100条数据 DROP ...

  8. Graph & Tree

    图论学习笔记 TYQ图论真是个渣渣呢 所以TYQ决定猛补图论 好的从0x60开始 表示博客园不用Latex真的烦呢QAQ,公式难打的要命QAQ 0x60~0x62 最短路讲解跳过 最小生成树: Kru ...

  9. Codeforces Round #606 E

    题:https://codeforces.com/contest/1277/problem/E 题意:给定无向图,求有多少个pair之间的简单路径一定要经过给定的点a和b(pair中任何一个都不是a或 ...

  10. 使用VMware vSphere Client管理ESXI(新建虚拟机)

    1.下载vSphere Client客户端 2.将镜像文件(ISO)上传到ESXI主机,具体操作见如下链接地址 https://blog.csdn.net/amandazhouzhou/article ...