【问题标题】:Generate reports in background and by schedule using Spring使用 Spring 在后台和按计划生成报告
【发布时间】:2013-12-06 02:31:23
【问题描述】:

用户可以通过两种方式生成报告。

  1. 用户单击前端的按钮,作业将运行以生成报告。
  2. 用户可以安排每周、每月等生成报告。

在场景 1 中,我决定首先将请求保存到一个表中,例如 "REQUEST_TBL"。在那之后,我将运行ThreadPoolTaskExecutor,它会从“REQUEST_TBL”中获取特定请求。可能有很多用户可以请求生成报告。但是每个用户一生最多只能生成 30 份报告(如果用户想要生成新报告,则需要删除所有旧报告)。

在场景 2 中,用户可以安排某个报告每周或每月生成。然后每周(或每月等)作业将运行并生成用户计划的此报告。

现在,我不确定如何实施报告生成器作业。我是否使用ThreadPoolTaskExecutor。或者使用相同的程序来处理用户请求和用户计划的报告请求。

我打算让每分钟运行一个作业来读取“REQUEST_TBL”,并且对于每条记录,我将运行 ThreadPoolTask​​Executor.execute()。但是如果有1000个用户同时请求报告,那么我应该如何实现线程的创建。同样对于预定的工作,我打算只在一天结束时运行它。计划的作业将从相同的“REQUEST_TBL”读取并查找计划的请求。对于场景 1,如果我想每隔 2 分钟运行一次作业,我应该运行到什么时候?因为可能是在那天结束时,需要运行计划的报告。另外,我想每隔 2 分钟运行一次作业,因为如果服务器出现故障,一旦服务器启动,就无法重新生成报告。

非常感谢您的建议

【问题讨论】:

标签: java multithreading spring scheduled-tasks


【解决方案1】:

你一次问了很多问题。这里的想法很少:

  • 绝对不要自己创建线程。宁可使用Executors 之一,并以此方式限制线程数。
  • 剩下的我会以最一致的方式来做:REQUEST_TBL 中的每条记录在需要生成时也会有时间。因此,在方案 1 中,您将与请求一起保存当前时间。在场景 2 中,您将创建一个带有时间戳的记录,该时间戳提前一周(几个月)。
  • 那么您可以每分钟或每两分钟运行一次作业,以查询请求时间早于或等于now 的请求。并为每条返回的记录安排一个作业给执行者。

【讨论】:

  • 对不起,我的措辞有误。我编辑了我的问题。我要做的不是创建线程,而是运行 ThreadPoolTask​​Executor.execute()。我不确定是否在用户请求之后运行这个 execute() 是好的。我也不太擅长穿线抱歉。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多