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