我正在使用Spring(Boot,MVC)开发一个Web应用程序,并且会有一些事情需要在后台运行,所以我不会阻止请求。
目前我正在考虑每隔5分钟运行一次Spring Batch作业并检查数据库中的表(jobs_queue),如果有事情要做,然后运行任务(根据表中每行所需的内容)
显然这不是一个很好的可扩展解决方案(我认为),因为我只有一个工作者(如果队列中有太多的工作,这个单个工作者可能无法处理负载),它也会在每5分钟至少进行一次数据库查询(也查看队列中是否有作业)。
这样做的更好方法是什么?
答案 0 :(得分:5)
添加@kotabek的答案,Spring Batch能够通过消息启动作业。因此,您可以让JobLaunchingMessagHandler
侦听启动作业的请求并相应地运行它。这允许您在本地(使用直接通道)或远程(通过像Rabbit这样的一些消息传递中间件)处理此用例。您可以在此处的文档中了解有关它的更多信息:http://docs.spring.io/spring-batch/reference/htmlsingle/#launching-batch-jobs-through-messages
答案 1 :(得分:3)
如果您使用的是Spring 4,请查看@Scheduled注释。
示例:
@Component
public class ScheduledTasks {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("The time is now " + dateFormat.format(new Date()));
}
}
代码参考 - https://spring.io/guides/gs/scheduling-tasks/
小记:不要忘记在配置中添加@EnableScheduling。
答案 2 :(得分:2)
我建议您使用RabbitMQ或ActiveMQ。因此,您可以在查询中编写任务,当某人或某事添加任务时,您的工作将起作用。我认为你可以将它与db集成并监听插入事件。