如何在Hangfire中使用.net core的默认依赖注入?
我是Hangfire的新手,正在寻找一个与asp.net核心兼容的例子.
我正在使用Hangfire,非常喜欢这个软件!但我缺少的一件事是如何添加每隔几分钟执行一次的定期工作(例如每15分钟执行一次).有没有办法实现这个目标?
有没有办法禁用失败的Hangfire BackgroundJob的重新排队?
我们不希望再次执行失败的作业,因为这可能会导致问题.
我正在考虑使用Hangfire作为重复工作的作业调度程序.所以配置它们很简单AddOrUpdate
,但是我该如何删除呢?我不希望RecurringJob.RemoveIfExists()
在删除该作业时污染我的代码,然后必须记住以后删除它.
有没有办法获取所有定期作业的列表并在服务器启动时删除它们,因此我的代码每次都会重新添加它们?如果没有,如果有更好的方法?
例如
应用程序版本1:添加了新的Hangfire定期作业 Do something 1
应用程序版本2:添加了新的Hangfire定期作业Do something 2
和Do Something 3
应用程序版本3:删除了Hangfire定期作业 Do something 2
问题:作业仍将存在于服务器上,并显示"无法加载类型..."错误,需要删除.
有没有办法每隔几秒设置一次篝火重复工作?我不寻求一个解决方案,即火灾和忘记任务会产生另一个火灾和忘记任务,如果没有,建议的替代方案是什么?
我有一个控制台应用程序来测试HangFire.这是代码:
using System;
using Hangfire;
namespace MyScheduler.ConsoleApp
{
internal static class Program
{
internal static void Main(string[] args)
{
MyMethod();
Console.WriteLine("[Finished]");
Console.ReadKey();
}
private static void MyMethod()
{
RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Minutely);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它在运行时抛出异常:
附加信息:JobStorage.Current属性值尚未初始化.您必须在使用Hangfire客户端或服务器API之前进行设置.
所以我需要一个工作存储来运行它.但是SQL存储中的所有示例等.有没有办法用某种内存存储来运行这个例子?
JobStorage.Current = new SqlServerStorage("ConnectionStringName", options);
// to
JobStorage.Current = new MemoryDbStorage(string.Empty, options);
Run Code Online (Sandbox Code Playgroud) 我有一个使用Ninject的MVC 5应用程序,我正在添加Hangfire.
当我添加Ninject时,NinjectWebCommon
由于其配置简单,我使用了nuget包.所以现在Ninject通过NinjectWebCommon
创建标准内核的类来配置并添加绑定.
此外,我创建了一些我在创建内核时加载的自定义模块
private static IKernel CreateKernel() {
var kernel = new StandardKernel( new MyCustomModule() );
try {
kernel.Bind<Func<IKernel>>().ToMethod( ctx => () => new Bootstrapper().Kernel );
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices( kernel );
return kernel;
}
catch {
kernel.Dispose();
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
Ninject Web Common是通过WebActivatorEx
课程注册的
[assembly: WebActivatorEx.PreApplicationStartMethod( typeof( MyProject.Web.NinjectWebCommon ), "Start" )]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute( typeof( MyProject.Web.NinjectWebCommon ), "Stop" )]
Run Code Online (Sandbox Code Playgroud)
现在问题与如何让Hangfire看到Ninject配置有关.通过查看Hangfire.Ninject
我能读到的包裹
该包为IGlobalConfiguration接口提供了一个扩展方法:
var kernel = new StandardKernel();
GlobalConfiguration.Configuration.UseNinjectActivator(kernel);
现在我的问题是:
IGlobalConfiguration
接口,我应该在OWIN启动方法中添加Hangfire Ninject配置(已经放置了Hangfire配置).我应该如何获得当前的Ninject内核(NinjectWebCommon配置的内核)?WebActivatorEx …
我正在重写整个问题因为我意识到原因,但仍然需要一个解决方案:
我在Hangfire中有一个经常性的工作,每分钟运行并检查数据库,可能更新一些东西,然后退出.
我将dbcontext注入包含job方法的类中.我注册这个dbcontext以使用以下注入
builder.RegisterType<ApplicationDbContext>().As<ApplicationDbContext>().InstancePerLifetimeScope();
Run Code Online (Sandbox Code Playgroud)
但是,每次作业运行时,Hangfire似乎都不会创建单独的生命周期范围,因为构造函数只会被调用一次,尽管每分钟调用一次作业方法.
这给我带来了问题.如果用户更新了数据库中的某些值(dbcontext被注入其他地方并用于更新值),则仍在使用的上下文Hangfire开始返回已更改的过时值.
我正在尝试使用Hangfire在后台运行定期作业,轮询来自其他网站的数据,问题是如果上一个作业仍在运行,我不希望重复作业运行.
我已阅读文档,但似乎无法找到答案.有没有办法让一个每10分钟运行一次的重复工作,但如果之前的任务还没有完成则会跳过?
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
// Hangfire
GlobalConfiguration.Configuration
.UseSqlServerStorage("DatabaseContext");
app.UseHangfireDashboard();
app.UseHangfireServer();
RecurringJob.AddOrUpdate("site-parser", () => SiteParserService.RunAll(), Cron.Minutely, TimeZoneInfo.Utc);
ConfigureAuth(app);
}
Run Code Online (Sandbox Code Playgroud) 我有asp.net核心API应用程序,这是我第一次使用HangFire.
在.Net Core应用程序中,我的所有方法都是异步的.基于SO Post,wait()
在hangfire中调用异步方法时使用它并不是一个好主意.
另外,根据v1.6.0中的hangfire支持问题,添加了异步支持.我使用的是1.6.12版,但我仍然没有看到异步支持.
我如何调用异步方法Enqueue
.目前我正在使用wait()
public class MyController : Controller
{
private readonly Downloader _downlaoder;
private readonly IBackgroundJobClient _backgroungJobClient;
public MyController(Downloader downloader, IBackgroundJobClient backgroungJobClient)
{
_downlaoder = downloader;
_backgroungJobClient = backgroungJobClient;
}
[HttpPost]
public void Post([FromBody]IEnumerable<string> files)
{
_backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files).Wait());
}
}
Run Code Online (Sandbox Code Playgroud) c# ×10
hangfire ×10
asp.net-core ×2
.net ×1
.net-core ×1
asp.net-mvc ×1
autofac ×1
ncron ×1
ninject ×1
recurring ×1