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. 十二星座 英文名:Aries 金牛座 (4/21 - 5/20)的英文名: Taurus 双子座 (5/21 - 6/21)的英文名: Gemini 巨蟹座 (6/22 - 7/22)的英文名: Cancer 狮子座 (7/23 - 8/22)的英文名: Leo 处女座/室女座 (8/23 - 9/22)的英文名: Virgo 天秤座 (9/2

    十二星座的具体顺序是:白羊座(Aries).金牛座(Taurus).双子座(Gemini).巨蟹座(Cancer).狮子座(Leo).处女座(Virgo).天秤座(Libra).天蝎座(Scorpio ...

  2. Ubuntu的man中文包安装

    apt-get install manpages-zh vi /etc/manpath.config :,$s#/usr/share/man#/usr/share/man/zh_CN#g 第一个命令: ...

  3. 生成随机数(Random类)和获取用户输入(Scanner类)

    生成指定范围内的随机数 Math.random() 生成随机数,随机数在0到1之间,类型是 double. public class randCase { public static void mai ...

  4. 记一次asp.net core 线上崩溃解决总结

    1.首先要先准备好环境,安装lldb 工具 要安装3.9版本的,因为每个版本对应dnc版本不一样,3.9的支持2.2 版本,然后确定分析的机器里dnc 版本和线上的生产环境是否一致,自己安装比较费劲, ...

  5. python学习笔记--数据类型和变量总结

    1.数据类型 字符串 数字 列表 元祖 字典 2.可变不可变划分 可变:列表,字典 不可变:字符串,数字,元祖 举例:字符串,通过id查看字符串变量在内存中的地址.两次存的值不一样,这就说明了内存重新 ...

  6. Java web之javascript(2020.1.6)

    1.js输出: windows.alert()---警告框 document.write()---写到html文档中 innerHTML---写到HTML元素 console.log()---写到浏览 ...

  7. mui + H5 调取摄像头和相册 实现图片上传

    最近要用MUI做项目,在研究图片上传时 ,遇到了大坑 ,网上搜集各种资料,最终写了一个demo,直接看代码.参考(http://www.cnblogs.com/richerdyoung/p/66123 ...

  8. GCC的分支预测优化__builtin_expect

    智能指针笔记 GCC的原子操作函数 将流水线引入cpu,可以提高cpu的效率.更简单的说,让cpu可以预先取出下一条指令,可以提供cpu的效率.如下图所示: 取指令 执行指令 输出结果 取指令 执行 ...

  9. oracle 查询表空间

    测试用户连接C:\Users\ZP>sqlplus /nologconn hbcxuser/hbcxpass --查看所有表空间 select * from user_tablespaces-- ...

  10. top 命令中的VIRT,RES,SHR ,MEM区别

    VIRT 表示进程的虚拟(地址)空间大小,其包含进程实际使用的大小(申请的堆栈), 使用mmap映射的大小,包括外设RAM, 还有映射到本进程的文件(例如动态库),还有进程间的共享内存.所以VIRT ...