Java 如何在Spring Boot中分离角色?(网络与调度程序等)

Java 如何在Spring Boot中分离角色?(网络与调度程序等),java,spring,spring-boot,Java,Spring,Spring Boot,我来自(大部分)PythonDjango/Cellery背景,从SpringBoot开始 我很难理解你是如何区分角色的 例如,当有一个Django/Cellery项目时,我会让一个web后端以gunicorn开头,另一个工人以Cellery开头(因此,不同的命令,但指向相同的代码) 但是在SpringBoot上,您只有一个入口点,一旦注入调度程序,作业就会开始被处理 在Django/芹菜应用程序中,正确的方法是什么? 我应该把几乎所有的代码都放在一个库中,然后创建两个最终应用程序,一个将设置@D

我来自(大部分)PythonDjango/Cellery背景,从SpringBoot开始

我很难理解你是如何区分角色的

例如,当有一个Django/Cellery项目时,我会让一个web后端以
gunicorn
开头,另一个工人以
Cellery
开头(因此,不同的命令,但指向相同的代码)

但是在SpringBoot上,您只有一个入口点,一旦注入调度程序,作业就会开始被处理

在Django/芹菜应用程序中,正确的方法是什么?
我应该把几乎所有的代码都放在一个库中,然后创建两个最终应用程序,一个将设置
@DispatcherServlet
,另一个将设置
@EnableScheduling
,还是在运行时要注入某种配置,如果“web”和“scheduler”都是应用程序中的重要功能,那么只要您创建一个单片应用程序,我们就不需要将它们分开

因为您使用的是spring boot,所以@DispatcherServlet和web应用程序所需的所有其他web组件都将被自动注入和配置。您需要做的唯一一件事就是创建一些用@Controller或@RestController注释的类,并在这些类中设置@RequestMapping方法

调度程序呢?您需要首先在其中一个@Configuration类中添加@EnableScheduling,然后在Scheduler包中创建Scheduler类,如下面的代码示例所示

您可以使用cron属性设置指定的执行时间,就像Linux crontab一样。只有在cron时间结束时,作业才会开始处理

@Component
public class PlatformScheduler {

    @Autowired
    private BatchService batchService;
   
    @Scheduled(cron = "0 0 12 * * *")
    public void dailyInitialize() {

        clearCompletedBatches();
        queryBatchesToRunToday();

    }


    @Scheduled(fixedRate = 10000, initialDelay = 10000)
    private void harvestCompletedBatches() {

        batchService.harvestCompletedBatches();

    }

    @Scheduled(fixedRate = 10000, initialDelay = 10000)
    private void executeWaitingBatches() {

        batchService.executeWaitingBatches(new DateTime());

    }

}
最简单的项目层次结构如下所示,“web”和“scheduler”可以安全地位于同一个项目中,并共享相同的@Service组件而不会造成损害


如果我真的需要将它们分开怎么办?通常,调度程序可能会运行非常CPU或IO密集型的程序,我不想影响体系结构的web层。如果“web”和“调度程序”各有其用途,那么您真的应该将它们分为两个项目。如果他们都需要访问一些相同的代码,您可以创建另一个项目并将共享代码放在其中。然后,通过模块将它们组合起来。()所以我的所有通用代码(服务、JPA等)都是库,然后是不同的应用程序,它们有自己的web部件和调度程序部件入口点?是的,这将更具弹性,更易于部署和调试。