1.安裝:
hangfire包、StackExchange.Redis(abp下的hangfire則安裝abp.hangfire)
2.配置
startup文件configuration方法添加以下代碼
GlobalConfiguration.Configuration.UseRedisStorage("127.0.0.1:6379");//redis配置 app.UseHangfireServer(new BackgroundJobServerOptions() {ServerName="testserver", Queues=new string[] { "testqueue"} });//開啟hangfire服務並進行初始化 app.UseHangfireDashboard();//使用儀盤表
3使用
public class HomeController : KenzoTestControllerBase { private readonly IBackgroundJobManager _backgroundJobManager; private readonly ITestOrder _testOrderManager; public HomeController(IBackgroundJobManager backgroundJobManager , ITestOrder testOrderManager ) { _backgroundJobManager = backgroundJobManager; _testOrderManager = testOrderManager; } public ActionResult Index() { //List<string> strList = new List<string>(); //strList.Add("母雞啊"); //strList.Add("我母雞啊"); //strList.Add("我真系母雞啊"); //ViewData["Test"] = strList; return View(); //return View("~/App/Main/views/layout/layout.cshtml"); //Layout of the angular application. } /// <summary> /// 原生hangfire /// </summary> /// <returns></returns> public async Task Test() { BackgroundJob.Enqueue(() => _testOrderManager.CreateOrder(new Orders.Order() { Description="4397",Id=Guid.NewGuid(),Money=777,Num="clearlove777"})); } /// <summary> /// abp.hangfire /// </summary> /// <returns></returns> public async Task Test2() { _backgroundJobManager.Enqueue<TestJob, Orders.Order>(new Orders.Order() { Description = "4397", Id = Guid.NewGuid(), Money = 777, Num = "clearlove777777" }); }
public class TestJob : IBackgroundJob<Order>, ITransientDependency { private readonly ITestOrder _testOrderManager; public TestJob(ITestOrder testOrderManager) { _testOrderManager = testOrderManager; } public async void Execute(Order args) { await _testOrderManager.CreateOrder(args); } }
public interface ITestOrder { /// <summary> /// 添加訂單 /// </summary> /// <param name="ordreId"></param> /// <returns></returns> Task<Order> CreateOrder(Order args); }
[Hangfire.Queue("testqueue")] public class TestOrder : ITestOrder { private readonly OrderService _orderService; public TestOrder() { _orderService = IocManager.Instance.Resolve<OrderService>(); } public async Task<Order> CreateOrder(Order args) { return await _orderService.CreateOrderAsync(args); } }
abp.hangfire的用法:Enqueue<TJob, TArgs>(TArgs args) where TJob : IBackgroundJob<TArgs>;最后會在Excute方法里面去執行
原生hangfire用法:Enqueue(Expression<Func<Task>> methodCall),直接在參數里面調用方法
然鵝不知道為什么,我調用abp.hangfire的方法,執行是沒問題的,但是在儀盤表里面沒有顯示該作業,而用原生的就可以顯示。如圖:
這是調用test2方法后的儀盤表,可以看到並沒有新的作業生成,但是數據庫確實添加了該數據
這是調用test方法,儀盤表有新的作業,數據庫也插入正常