我需要在特定工作日的特定时间触发工作。这些工作日也是动态的,应从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)
}
请给我一些建议,以便我可以实现自己的需要。
答案 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