本文介绍了Azure服务交换矩阵-固定时间作业的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理一个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点)

推荐答案

考虑创建一个具有周期性触发提醒的执行元,比方说每分钟触发一次。(取决于所需的精确度)在其状态中,定义指定操作需要执行的时间的"到期时间"。

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

在状态内部,存储上次执行的时间戳以避免重复执行。

定期检查错过的执行。

通过这种方式,您可以处理群集中的临时中断(服务移动、重启、升级等)

这篇关于Azure服务交换矩阵-固定时间作业的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 22:43