【问题标题】:Trigger a function at random time on every day with Quartz使用 Quartz 在每天的随机时间触发一个函数
【发布时间】:2016-05-27 12:25:20
【问题描述】:

如何在每天的随机时间(0-24)触发一个函数 或使用 Quartz 在指定时间范围(上午 9:00 - 下午 6:00)每天触发一次。

例如,今天上午 11:20 工作,明天下午 04:12 工作

提前致谢。

【问题讨论】:

  • 它是什么?在00:0000:0009:0018:00 之间?
  • 重要吗?这两种情况怎么会有变化?事实上,我想给出开始和结束时间。
  • 如果能在整整 24 小时之内搞定逻辑,那就有点棘手了。

标签: c# scheduled-tasks quartz-scheduler quartz.net


【解决方案1】:

我建议这样做:

  1. 执行后删除当前触发器
  2. 为第二天创建新的触发器
  3. 重复

用于创建代码的代码可能是这样的:

    public DailyTimeIntervalTriggerImpl GetNextTrigger(int minHour, int maxHour)
    {
        var random = new Random();

        int randomHour = random.Next(minHour, maxHour + 1);
        int randomMinute = random.Next(0, 60);

        var nextDayOfWeek = DateTime.Now.AddDays(1).DayOfWeek;
        var daysOfWeek = new Quartz.Collection.HashSet<System.DayOfWeek>() { nextDayOfWeek };

        var trigger = new DailyTimeIntervalTriggerImpl
        {
            DaysOfWeek = daysOfWeek,
            StartTimeUtc = DateTime.UtcNow,
            StartTimeOfDay = new TimeOfDay(randomHour, randomMinute, 0),
            TimeZone = TimeZoneInfo.Utc
        };
        return trigger;
    }

【讨论】:

  • 请不要这样做var random = new Random(DateTime.Now.Millisecond);。做var random = new Random(); 一样好。最好是制作一个字段级变量,甚至更好的是一个线程静态字段。
  • 您可能还希望将对random.Next(...) 的调用更改为random.Next(minHour, maxHour + 1)random.Next(0, 60),因为上限是独占
  • 感谢@Enigmativity 的努力。但是,触发器没有名字,你没有定义,为什么?此外,此代码仅适用于第二天。我的实际问题触发器应该设置今天的时间表然后你的代码,可能吗?
  • @HakanIlgar 可以在DailyTimeIntervalTriggerImpl的构造中添加名称,在TimeZone下面添加Name = "my trigger name"(例如)。这段代码确实只在第二天有效……如果你想在今天触发它,你会遇到其他问题,比如当天已经太晚了,所以minHourmaxHour 是“过去的”。请记住,使用此代码,您必须在每次前一个触发器完成时重新创建触发器。 IMO 挑战不是第一个触发器,而是每次都删除和添加一个新触发器。
猜你喜欢
  • 2021-11-24
  • 2012-08-22
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多