279 lines
6.3 KiB
Markdown
279 lines
6.3 KiB
Markdown
# Getting Started
|
||
|
||
## Storage
|
||
|
||
Hangfire 會將所有相關資訊會被序列化後保存到儲存區,如類型、方法或參數等。
|
||
|
||
儲存模型官方預設有以下幾種
|
||
|
||
<table>
|
||
<thead>
|
||
<td></td>
|
||
<td>Sql Server 2008+</td>
|
||
<td>Redis 2.6.12+</td>
|
||
<td>In-Memory</td>
|
||
<td>Price</td>
|
||
</thead>
|
||
<tbody>
|
||
<td>Open</td>
|
||
<td>✔</td>
|
||
<td></td>
|
||
<td>✔</td>
|
||
<td>free</td>
|
||
</tbody>
|
||
<tbody>
|
||
<td>Startup</td>
|
||
<td>✔</td>
|
||
<td>✔</td>
|
||
<td>✔</td>
|
||
<td>$500 / per year</td>
|
||
</tbody>
|
||
<tbody>
|
||
<td>Business</td>
|
||
<td>✔</td>
|
||
<td>✔</td>
|
||
<td>✔</td>
|
||
<td>$1,500 / per year</td>
|
||
</tbody>
|
||
<tbody>
|
||
<td>Enterprise</td>
|
||
<td>✔</td>
|
||
<td>✔</td>
|
||
<td>✔</td>
|
||
<td>$4,500 / per year</td>
|
||
</tbody>
|
||
</table>
|
||
|
||
資料來源日期: 2024/03/12
|
||
|
||
```
|
||
// Hangfire 1.8
|
||
GlobalConfiguration
|
||
.Configuration
|
||
.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
|
||
.UseSimpleAssemblyNameTypeSerializer()
|
||
.UseRecommendedSerializerSettings()
|
||
.UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;");
|
||
|
||
// Hangfire 1.7
|
||
GlobalConfiguration
|
||
.Configuration
|
||
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
|
||
.UseSimpleAssemblyNameTypeSerializer()
|
||
.UseRecommendedSerializerSettings()
|
||
.UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions
|
||
{
|
||
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
|
||
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
|
||
QueuePollInterval = TimeSpan.Zero,
|
||
UseRecommendedIsolationLevel = true,
|
||
DisableGlobalLocks = true, // Migration to Schema 7 is required
|
||
});
|
||
|
||
// Hangfire SQLite
|
||
GlobalConfiguration
|
||
.Configuration
|
||
.UseSQLiteStorage("HangfireExample.db"));
|
||
```
|
||
|
||
## Server
|
||
|
||
啟動 Hangfire 伺服器
|
||
|
||
```
|
||
services.AddHangfireServer();
|
||
```
|
||
|
||
## Using Dashboard UI
|
||
|
||
開啟 Dashboard 功能
|
||
|
||
```
|
||
app.UseHangfireDashboard();
|
||
```
|
||
|
||
* Configuring Authorization
|
||
|
||
設定自定義驗證
|
||
|
||
```
|
||
app.UseHangfireDashboard("hangfire", new DashboardOptions
|
||
{
|
||
Authorization = [new DashboardAuthorizationFilter()],
|
||
});
|
||
```
|
||
|
||
* Read-only view
|
||
|
||
設定 UI 為 ReadOnly
|
||
|
||
```
|
||
app.UseHangfireDashboard("hangfire", new DashboardOptions
|
||
{
|
||
IsReadOnlyFunc = (DashboardContext context) => true,
|
||
});
|
||
```
|
||
|
||
* Change URL Mapping
|
||
|
||
修改 Dashboard UI 的預設根路由
|
||
|
||
```
|
||
app.UseHangfireDashboard("hangfire");
|
||
```
|
||
|
||
* Change Back to site Link
|
||
|
||
修改返回按鈕的路由
|
||
|
||
```
|
||
app.UseHangfireDashboard("hangfire", new DashboardOptions
|
||
{
|
||
AppPath = "/swagger", // 導向到 Swagger UI
|
||
});
|
||
```
|
||
|
||

|
||
|
||
* Multiple Dashboards
|
||
|
||
設定不同資料來源的 Dashboard
|
||
|
||
```
|
||
app.UseHangfireDashboard(configuration.GetValue<string>("DashboardRoot"), new DashboardOptions
|
||
{
|
||
Authorization = [new DashboardAuthorizationFilter()],
|
||
// 指定 Dashboard 指定讀取,不能操作,如重新執行、再次加入排程與刪除任務等
|
||
IsReadOnlyFunc = (DashboardContext context) => true,
|
||
// 指定 Back to site 的連結
|
||
AppPath = "/swagger",
|
||
}, new SQLiteStorage("HangfireExample2.db"));
|
||
```
|
||
|
||
## Background Methods
|
||
|
||
排程可以直接執行特定方法,Hangfire 會將方法(可使用非同步)、類型與參數序列化後保存到資料庫,Hangfire 依照排程類型,分為以下四種
|
||
|
||
* Fire-and-Forget jobs: 將任務丟入執行佇列,直接執行
|
||
|
||
```
|
||
BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-Forget"));
|
||
```
|
||
|
||
* Delayed jobs: 延遲指定時間後,將任務丟入執行佇列
|
||
|
||
```
|
||
BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
|
||
```
|
||
|
||
* Recurring jobs: 依照指定間隔,將任務丟入執行佇列
|
||
|
||
Cron Expression [測試](https://crontab.guru/)
|
||
|
||
<table>
|
||
<thead>
|
||
<td>分</td>
|
||
<td>時</td>
|
||
<td>月中的日</td>
|
||
<td>月</td>
|
||
<td>週中的日</td>
|
||
<td>說明</td>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>0/30</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>每30分鐘執行一次</td>
|
||
</tr>
|
||
<tr>
|
||
<td>30</td>
|
||
<td>9</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>每日早上09:30執行一次(UTC)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>30</td>
|
||
<td>9</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>MON-FRI</td>
|
||
<td>每週一到週五早上09:30執行一次(UTC)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>30</td>
|
||
<td>09</td>
|
||
<td>1</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>每月1號早上09:30執行一次(UTC)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>0-30/30</td>
|
||
<td>9</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>每日早上09:00~09:30,每30分鐘執行一次(UTC)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>0/30</td>
|
||
<td>9-12</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>每日早上09:00~12:00,每30分鐘執行一次(UTC)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>0/30</td>
|
||
<td>9-12</td>
|
||
<td>1-5</td>
|
||
<td>*</td>
|
||
<td>*</td>
|
||
<td>每月1號到5號早上09:00~12:00,每30分鐘執行一次(UTC)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
```
|
||
RecurringJob.AddOrUpdate("job_id", () => Console.Write("Recurring By CRON"), Cron.Daily);
|
||
|
||
RecurringJob.AddOrUpdate("job_id", () => Console.Write("Recurring By CRON expressions"), "* 0/1 * * ? *");
|
||
```
|
||
|
||
移除已存在的排程任務
|
||
|
||
```
|
||
RecurringJob.RemoveIfExists("job_id");
|
||
```
|
||
|
||
手動觸發已存在的排程任務
|
||
|
||
```
|
||
RecurringJob.Trigger("job_id");
|
||
```
|
||
|
||
|
||
* Continuations: 指定的任務完成後,才丟入執行佇列
|
||
|
||
```
|
||
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-Forget"));
|
||
|
||
BackgroundJob.ContinueJobWith(jobid, () => Console.WriteLine("Continuations"));
|
||
```
|
||
|
||
## Extensions
|
||
|
||
### Progressing text console and show bar
|
||
|
||
```
|
||
NUGET INSTALL Bonura.Hangfire.PerformContextAccessor -Version 1.3.3
|
||
|
||
NUGET INSTALL Hangfire.Console -Version 1.4.3
|
||
```
|
||
|
||
 |