1. 首页
  2. 技术文章
  3. java

JobRunr框架与常见Java类库的整合指南

JobRunr 是一个面向 Java 的开源框架,用于在后台执行长时间运行的任务。与其他常见的 Java 类库(如 Spring、Quartz 和 Hibernate)结合使用,可以实现任务调度、任务队列和任务处理等功能。下面是 JobRunr 框架与常见 Java 类库整合的指南。 ### 1. 与 Spring 框架整合 #### a. 添加 Maven 依赖 <dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr-spring-boot-starter</artifactId> <version>2.4.0</version> </dependency> #### b. 创建任务类 import org.jobrunr.jobs.annotations.Job; import org.jobrunr.jobs.context.JobContext; import org.jobrunr.jobs.lambdas.JobLambdaFromStream; @Job(name = "mySimpleJob") public class MySimpleJob implements Runnable { @Override public void run() { // 实现任务逻辑 } public static void main(String[] args) { JobRunr.configure() .useJobActivator(new SimpleJobActivator(null)) .useJobFilters(new AutomaticTypeBasedRegistrationProviderJobFilter()) .useDefaultBackgroundJobServer() .run(); } } #### c. 创建 Spring 配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling public class JobRunrConfig { @Bean public JobRunrDashboardWebServer jobRunrDashboardWebServer() { return new JobRunrDashboardWebServer(); } @Bean public BackgroundJobServer backgroundJobServer() { return new BackgroundJobServer(); } } #### d. 创建任务调度配置 import org.jobrunr.configuration.JobRunr; import org.jobrunr.jobs.filters.DelayedJobFilter; import org.jobrunr.scheduling.JobScheduler; import org.jobrunr.scheduling.cron.Cron; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration public class JobSchedulerConfig implements SchedulingConfigurer { @Autowired private JobScheduler jobScheduler; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addCronTask(() -> jobScheduler.<MySimpleJob>enqueue(mySimpleJob -> mySimpleJob.run(), Cron.minutely()), "*/5 * * * *"); } } ### 2. 与 Quartz 整合 #### a. 添加 Maven 依赖 <dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr-quartz</artifactId> <version>2.4.0</version> </dependency> #### b. 配置 Quartz import org.jobrunr.dashboard.JobRunrDashboard; import org.jobrunr.dashboard.server.http.OptionsMethodFilter; import org.jobrunr.dashboard.server.http.StaticFileFromDiskRoute; import org.jobrunr.dashboard.server.http.client.HttpClient; import org.jobrunr.dashboard.server.http.client.OkHttpHttpClient; import org.jobrunr.quartz.SimpleSchedulerFactory; import org.jobrunr.quartz.scheduler.DefaultQuartzScheduler; import org.jobrunr.quartz.scheduler.JobRunrJobFactory; import org.jobrunr.server.BackgroundJobServer; import org.jobrunr.scheduling.JobScheduler; import org.quartz.SchedulerException; import org.quartz.impl.StdSchedulerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import(ApplicationConfig.class) public class JobRunrConfig { @Bean public JobRunrDashboard requestHandlers() { JobRunrDashboard dashboard = new JobRunrDashboard(); // 设置静态文件路径 dashboard.addRoute(new StaticFileFromDiskRoute("/", "static")); // 设置选项请求处理器 dashboard.addRequestFilter(new OptionsMethodFilter()); // 设置 HTTP 客户端 dashboard.useHttpClient(getHttpClient()); return dashboard; } @Bean public BackgroundJobServer backgroundJobServer(JobRunrDashboard dashboard, JobScheduler<DefaultQuartzScheduler> jobScheduler) { return new BackgroundJobServer(jobScheduler, dashboard); } @Bean public JobScheduler<DefaultQuartzScheduler> jobScheduler() throws SchedulerException { return new JobScheduler<>(getScheduler()); } @Bean public org.quartz.Scheduler scheduler() throws SchedulerException { return SimpleSchedulerFactory.createScheduler(); } @Bean public JobRunrJobFactory jobRunrJobFactory() { return new JobRunrJobFactory(); } private HttpClient getHttpClient() { return new OkHttpHttpClient(); } private org.quartz.Scheduler getScheduler() throws SchedulerException { StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(); return schedulerFactory.getScheduler(); } } ### 3. 与 Hibernate 整合 #### a. 添加 Maven 依赖 <dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr-persistence-hibernate</artifactId> <version>2.4.0</version> </dependency> #### b. 配置 Hibernate import com.zaxxer.hikari.HikariDataSource; import org.hibernate.cfg.AvailableSettings; import org.jobrunr.configuration.JobRunr; import org.jobrunr.persistence.sql.CommonTableQuartzWrapper; import org.jobrunr.storage.sql.common.DefaultSqlStorageProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import javax.sql.DataSource; @Configuration @EnableScheduling public class JobRunrConfig { @Bean public DataSource dataSource() { HikariDataSource dataSource = new HikariDataSource(); dataSource.setDriverClassName("org.postgresql.Driver"); dataSource.setJdbcUrl("jdbc:postgresql://localhost:5432/jobrunr"); dataSource.setUsername("jobrunr"); dataSource.setPassword("password"); return dataSource; } @Bean public JobRunrDatabaseCreator createSchema() { return new JobRunrDatabaseCreator(getDataSource()); } @Bean(name = "jobRunrConnectionFactory") public ConnectionFactory connectionFactory() { return new org.jobrunr.persistence.sql.common.DefaultConnectionFactory() { @Override public Connection getConnection() { return org.jobrunr.persistence.sql.common.DefaultConnectionFactory.tryOpen(() -> getDataSource().getConnection()); } @Override public org.jooq.Configuration configuration() { DefaultSqlStorageProvider provider = new DefaultSqlStorageProvider(this); provider.setTableName("JobRunr_jobs"); // 设置任务表(默认为另一个表) provider.setJobDetailsClass(CommonTableQuartzWrapper.JobDetails.class); provider.setJobHistoryClass(CommonTableQuartzWrapper.JobHistory.class); return provider; } }; } @Bean public JobRunrHibernateStorageProvider jobStorageProvider(ConnectionFactory connectionFactory) { return new JobRunrHibernateStorageProvider(connectionFactory); } @Bean public AutomaticTypeBasedRegistrationProviderJobFilter automaticTypeBasedRegistrationProviderJobFilter() { return new AutomaticTypeBasedRegistrationProviderJobFilter(); } @Bean public JobScheduler jobScheduler(ConnectionFactory connectionFactory) { return JobRunr.configure() .useJobActivator(new JobActivatorFactory(ApplicationContexts.getApplicationContext())) .useJobFilters(new AutomaticTypeBasedRegistrationProviderJobFilter()) .useStorageProvider(new JobRunrHibernateStorageProvider(connectionFactory)) .initialize(); } } 上述代码中的 `ApplicationConfig` 类是与具体应用程序相关的配置类,需要根据应用程序的实际需求进行自定义。 希望这篇文章能够帮助你更好地理解 JobRunr 框架与常见 Java 类库的整合。在使用这些整合配置时,请根据具体需求进行相应的调整和配置。
Read in English