【问题标题】:Best way to execute a method after some time in Spring [closed]在春季一段时间后执行方法的最佳方法[关闭]
【发布时间】:2021-06-02 12:37:33
【问题描述】:

用户发送产品请求。如果 9 小时内没有卖家回复,系统会将此请求发送给其他拥有类似产品的卖家。

调度程序对我来说不是一个选项,因为用户发送的每个请求应该正好是 9 小时。

那么什么是正确的方法呢?

P.S 请求、用户等都存储在 Postgres 数据库中。

【问题讨论】:

  • 调度程序无法提供的“正好 9 小时”的精度需要多少?
  • @JensSchauder 好吧,我想您可以将调度程序设置为每分钟唤醒一次,但如果稍后只有少数要约要检查,那将浪费资源。

标签: spring postgresql spring-boot scheduled-tasks


【解决方案1】:

我知道这是一个繁重的框架,但我对任何复杂调度的首选解决方案是 Quartz http://www.quartz-scheduler.org/documentation/quartz-2.3.0/quick-start.html

作业数据可以持久化到数据库,内置了心跳、锁定、集群、失火处理、取消……成熟的调度框架。

从他们的例子来看,一个简单的触发器应该足以满足您的用例:

    // get a "nice round" time a few seconds in the future...
    Date startTime = DateBuilder.nextGivenSecondDate(null, 15);

    // job1 will only fire once at date/time "ts"
    JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();

    SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1").startAt(startTime).build();

    // schedule it to run!
    Date ft = sched.scheduleJob(job, trigger);

困难的部分是在您的项目中进行石英的初始设置,如果您希望有其他场景,您希望在未来某个时间可靠地触发某些东西(无论是否再次发生),这都是值得的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多