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方法,仪盘表有新的作业,数据库也插入正常
原文:https://www.cnblogs.com/kenzoBlog/p/10570320.html