仅对特定计数重复Quartz作业

时间:2019-01-28 08:45:28

标签: .net quartz-scheduler quartz.net quart

我需要在特定工作日的特定时间触发工作。这些工作日也是动态的,应从db获取。此外,该作业还应触发或重复进行特定次数的计数。假设Job j应该在每个星期一,星期五,星期五触发一次,重复计数15,即3 * 5 = 15,因此应该在接下来的3周内触发。

我尝试按以下方式使用cronexpression,但在经过一定的计数后找不到如何阻止作业触发。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btnLoad.setOnClickListener {
            doAsync {
                val arr = arrayOf("https://rafelcf.000webhostapp.com/rafel_cf/1.php",
                    "https://rafelcf.000webhostapp.com/rafel_cf/2.php")
                arr.forEach {
                    val jsonText = URL(it).readText()
                    // we know that result json is an array
                    val jsonArray = JSONArray(jsonText)
                    for(i in 0 until jsonArray.length()) {
                        // get each elements
                        val jsonObject = jsonArray[i] as JSONObject
                        // get data of each elements
                        val idLocal = jsonObject.getString("idLocal")
                        val idClubLocal = jsonObject.getString("idClubLocal")
                        val nomLocal = jsonObject.getString("nomLocal")
                        uiThread {
                            log("[item $i]")
                            log("idLocal: $idLocal")
                            log("idClubLocal: $idClubLocal")
                            log("nomLocal: $nomLocal")
                        }
                    }
                }
            }
        }
    }
    fun log(message: String) = Log.d("MainActivity", message)
}

请给我一些建议,以便我可以实现自己的需要。

2 个答案:

答案 0 :(得分:0)

cron计划不具有仅触发一定次数的概念。也许您会更幸运with the other scheduling methods

EndAt可能会更有用,并且无论调度程序如何,它似乎都可用。

答案 1 :(得分:0)

您可以使用ISimpleTrigger每天创建简单触发器。你不需要用 这项工作的任何cron触发器。首先,您应该得到一个匹配的日期。

   DateTime today = DateTime.Today;
   // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
   int daysUntilMonday = ((int)DayOfWeek.Monday - (int)today.DayOfWeek + 7) % 7;
   DateTime nextMonday = today.AddDays(daysUntilMonday);

    DateTime today = DateTime.Today;
   // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
   int daysUntilWednesday = ((int)DayOfWeek.Wednesday - (int)today.DayOfWeek + 7) % 7;
   DateTime nextWednesday = today.AddDays(daysUntilWednesday);

然后您可以创建这样的触发器。

   ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
      .WithIdentity("DEFAULT")
      .StartAt(nextMonday)   // or .StartAt(nextWednesday)
      .WithSimpleSchedule(x => x
           .WithIntervalInHours(168) // 1 week = 168h
           .WithRepeatCount(3))   // Repeat on 3 weeks
           .Build();

此简单触发器在重复执行后将自动删除。

有关更多详细信息-https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/simpletriggers.html