我正在从事一个 Service Fabric 项目,我需要在其中实施可以在特定时间(比如每 16 小时或 24 小时)执行的计划作业。
这是我的有状态演员服务实现
[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());
}
}
}
在代码中,我已经注册了我的演员服务,以便在注册后 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 点)