前情提要
筆者上篇介紹完Coravel的Scheduler
功能後,這篇要來實作Queue
的功能了,筆者敘述一下工作上用到的情境,最近因大系統要上線,必須實作Data Migration
,為方便,不防做一個前端頁面,才可以有介面去點擊執行Data Migration
作業,想當然爾,作業時間一定無法在一個Request
時間內完成,一定會噴Timeout Error
。
再則為這點小功能,不想透過Hangfire的BackgroundJob.Enqueue
來實作,這時想到Coravel
也有提供Queue
功能,API站台的action收到Data Migration的request後,塞入一則Coravel
的Queue
,由Queue
對應的Service去往下執行對應的作業,是個完美的方案吧。
內容
安裝Coravel套件
1 | dotnet add package coravel |
註冊Coravel的Queue服務
首先必須於Startup.cs
中註冊Queue
1 | public void ConfigureServices(IServiceCollection services) |
建構值注入IQueue
1 | IQueue _queue; |
QueueJob宣告
QueueJob
QueueJob與Scheduler一樣,需要實作IInvocable
1 | public class LogQueueJob : IInvocable |
QueueJobWithPayload
為了示範PayLoad傳送,宣告一個Class
1 | public class UserModel |
因為需要做序列化成字串輸出,安裝老牌子序列化套件Json.NET
1 | dotnet add package Newtonsoft.Json |
筆者就沿用Coravel那篇的Log形式
1 | public class LogQueueJobWithPayLoad : IInvocable, IInvocableWithPayload<UserModel> |
其中比LogQueueJob多了一個實作IInvocableWithPayload<T>
,該T
為要傳輸的Model
型別,筆者這邊使用前一步宣告好的UserModel
,再則需要宣告一個同樣T型別的參數,並且名為Payload
,就大功告成了。
執行QueueJob
QueueJob註冊
筆者上篇也有提醒過,Coravel
也是透過Dotnet Core
的DI機制,取得QueueJob
並執行,因此需要將QueueJob
做註冊的動作
1 | public void ConfigureServices(IServiceCollection services) |
撰寫Demo Action
分別為api/home/queue
以及api/home/queuewithpayload
1 | /// <summary> |
執行結果
筆者使用單純的dotnet run
指令來啟動API站台
1 | dotnet run |
打開Postman
,輸入http://localhost:5000/api/home/queue
,http method
選擇Post
再則我們在command line
畫面看輸出
再來試Payload部份,調整一下Postman
中的url
,結尾改為queuewithpayload
從command line
看輸出
可以從結果看出將payload
序列化後輸出的結果,也正常輸出時間以及environment
的contentrootpath
結論
若有一些作業是不需要馬上回應,只要背景作業,筆者認為Coravel
的Queue
功能不失為一個選項,簡單設定,符合dotnet core的DI機制
,簡單上手,推薦給大家。
參考
https://docs.coravel.net/Queuing/