使用Spring在后台运行进程的推荐方法是什么?

时间:2016-01-18 20:15:49

标签: java spring spring-mvc spring-boot spring-batch

我正在使用Spring(Boot,MVC)开发一个Web应用程序,并且会有一些事情需要在后台运行,所以我不会阻止请求。

目前我正在考虑每隔5分钟运行一次Spring Batch作业并检查数据库中的表(jobs_queue),如果有事情要做,然后运行任务(根据表中每行所需的内容)

显然这不是一个很好的可扩展解决方案(我认为),因为我只有一个工作者(如果队列中有太多的工作,这个单个工作者可能无法处理负载),它也会在每5分钟至少进行一次数据库查询(也查看队列中是否有作业)。

这样做的更好方法是什么?

3 个答案:

答案 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集成并监听插入事件。