Azure服务结构-固定时间作业



我正在一个Service Fabric项目中工作,我需要实现一个可以在特定时间执行的调度作业(例如每16小时或24小时)。

这是我的有状态actor服务实现

[StatePersistence(StatePersistence.None)]
internal class Actor3 : Actor, IActor3, IRemindable
{
public Actor3(ActorService actorService, ActorId actorId): base(actorService, actorId)
{
}
public async Task RegisterReminder()
{
try
{
var previousRegistration = GetReminder("Reminder2");
await UnregisterReminderAsync(previousRegistration);
}
catch (ReminderNotFoundException) { }
var reminderRegistration = await RegisterReminderAsync("Reminder2", null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
}
public async Task ReceiveReminderAsync(string reminderName, byte[] state, TimeSpan dueTime, TimeSpan period)
{
var location = Directory.GetCurrentDirectory();
var current = DateTime.Now;
Thread.Sleep(15000);
using (var writer = File.AppendText("actor.txt"))
{
await writer.WriteLineAsync("2 :: " + current.ToString() + " --> " + DateTime.Now.ToString());
}
}
}

在代码中,我已经注册了我的actor服务,从注册开始1分钟后开始执行,然后每1分钟执行一次。

当我查看"actor.txt"中的日志时,我看到的如下所示:

2 :: 2021-10-11 17:31:15 --> 2021-10-11 17:31:30
2 :: 2021-10-11 17:32:30 --> 2021-10-11 17:32:45
2 :: 2021-10-11 17:33:45 --> 2021-10-11 17:34:00

从上面的日志中,我可以看到

  • 第一次执行开始于17:31:15,完成于17:31:30(耗时15秒)
  • 第二次执行开始于17:32:30(距离结束时间1分钟),完成于17:32:45。根据上述要求,它应该在17:32:15开始(因为预期的持续时间是两次执行之间的1分钟,而不是1分钟+上一次执行时间)。

似乎我很难找到解决方案,其中我可以使演员在特定时间执行。(即每天下午4点或12点)

考虑创建一个带有周期性触发提醒的参与者,比方说每分钟触发一次。(取决于所需的准确性)在其状态中,定义'due time',指定何时需要执行操作。

将"到期时间"与当前时间进行比较,包括增量。如果有重叠,执行任务。

在状态中存储最后一次执行的时间戳,以避免重复执行。

定期检查错过的执行。

这样,您可以处理集群中的临时中断(服务移动、重新启动、升级等)

最新更新