重复任务时,下一次没有精确触发(到秒)
1.已将Hangfire的SchedulePollingInterval 设为1,按分重复执行任务时仍不能精确到按秒执行(如12:30:00执行一次,下一次应该是12:31:00,实际可能快二十几秒,有时又慢几秒)
2.demo很简单的,没有做其他任务,应该不会误差达十几秒。不知哪里没有写对?
using Hangfire;
using Hangfire.MySql;
namespace HandleFireTest
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)//此方法 只初次创建数据库使用即可
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseStorage(new MySqlStorage("Server=127.0.0.1;uid=root;pwd=123;database=Jobs;AllowLoadLocalInfile=true;Allow User Variables=True", new MySqlStorageOptions
{
TransactionIsolationLevel = (System.Transactions.IsolationLevel?)System.Data.IsolationLevel.ReadCommitted, //事务隔离级别。默认是读取已提交
QueuePollInterval = TimeSpan.FromSeconds(1), //- 作业队列轮询间隔。默认值为15秒。
JobExpirationCheckInterval = TimeSpan.FromMinutes(20),
CountersAggregateInterval = TimeSpan.FromMinutes(5),
PrepareSchemaIfNecessary = true, // 如果设置为true,则创建数据库表。默认是true
DashboardJobListLimit = 50000,
TransactionTimeout = TimeSpan.FromMinutes(1),
TablesPrefix = "Hangfire",
})));
builder.Services.AddHangfireServer(options =>
{
options.ServerName = "task";
options.SchedulePollingInterval = TimeSpan.FromMicroseconds(1000);
options.HeartbeatInterval = TimeSpan.FromMicroseconds(1000);
options.WorkerCount = Math.Max(Environment.ProcessorCount, 20);//并行数
});
//builder.Services.AddHangfireServer();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseHangfireDashboard();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
}
}
}
using HandleFireTest.Models;
using Hangfire;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace HandleFireTest.Controllers
{
public class MyJob
{
public string MyMethod()
{
Console.WriteLine("execute method!"+DateTime.Now);
// 后台任务逻辑
return "Hello, World!";
}
}
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public void WriteLog(string msg)
{
//Debug.WriteLine($"Hangfire于{DateTime.Now}执行了任务[{msg}]");
}
public IActionResult Index()
{
//Console.Write("队列任务1");
//支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。
//var jobId = BackgroundJob.Enqueue(() => WriteLog("队列任务"));
return View();
}
private static object Deserialize(string result)
{
// 反序列化逻辑
return result;
}
private string SendEmail(string email) { return "ol"; }
public IActionResult Privacy()
{
// 使用 Hangfire 的实例化方法
//var jobId1 = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));
//var jobId2 = BackgroundJob.Enqueue<MyJob>(x => x.MyMethod());
//var jobId3 = BackgroundJob.Schedule<MyJob>(x => x.MyMethod(), TimeSpan.FromSeconds(8));
//RecurringJob.AddOrUpdate<MyJob>(x => x.MyMethod(), Cron.MinuteInterval(1));
RecurringJob.AddOrUpdate<MyJob>(x=>x.MyMethod(), "0 */1 * * * ?");//每1分一次
//如果存在就删除周期任务
//RecurringJob.RemoveIfExists("some-id");
//触发周期任务
//RecurringJob.Trigger("some-id");
// 获取Hangfire连接对象
//var connection = JobStorage.Current.GetConnection();
// 获取后台任务的详细信息
//var jobData = connection.GetJobData(jobId1);
//RecurringJob.Trigger(jobId1);
// 获取返回对象
//var result = jobData.Result;
//// 反序列化返回对象
//var deserializedResult = Deserialize(result);
//var server = new BackgroundJobServer();
//// 做一些其它事情...
//server.SendStop();
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}