Hangfire激励器未处理



我遇到了Hangfire没有在NET5上的WebApi中处理它实例的对象的问题。

这是我在";配置服务(("(相当标准,顺便说一句(:

services.AddScoped<ITestService, TestService>(); // I have also tried with "AddTransient()"
services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("Default")));
services.AddHangfireServer();

然后,我有下面的行来配置"中的重复作业;Configure((":

public void Configure(IApplicationBuilder app,
IWebHostEnvironment env,
IHttpContextAccessor httpContextAccessor,
ITestService testService)
{
// Omitting other configure code here
RecurringJob.AddOrUpdate("Check", () => testService.Test(), Cron.Minutely); // You can try "*/1 * * * ? *" to speed it up
}

正如你所看到的";ITestService";正在通过IoC注入。

仅供参考,";ITestService";是";IDisposable";。如果我在构造函数和";Dispose(("方法,构造函数在每个间隔调用,而";Dispose(("从未被调用。

这对我来说是个问题,因为服务本身还有其他依赖项,比如Repository(即:SQL连接(。每当时间过去,应用程序就会开始中断,因为它失去了池中的连接:

失败:Hangfire。正在处理。背景执行[0]由于出现异常,Execution Worker现在处于Failed状态,将在00:05:00之前重试执行系统InvalidOperationException:超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小。

如果我没有错的话,这个错误通常与未处理SQL连接有关。

那么,你认为我做错了什么吗?或者它可能是一个bug?

编辑:

如果我把";这Dispose(("在TestService结束时。Test((,然后我在那里手动处理Repository,然后修复了以前的错误。但我认为这不是一个合适的解决方案:S。

正如评论中所说,您应该使用:

RecurringJob.AddOrUpdate<ITestService>("Check", t => t.Test(), Cron.Minutely);

以这种方式调用方法将触发ITestServer的依赖注入,实例将遵循预期的生命周期,并需要调用Dispose()

最新更新