<dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr-spring-boot-starter</artifactId> <version>2.4.0</version> </dependency> 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(); } } 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(); } } 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 * * * *"); } } <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> 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()); 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(); } } <dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr-persistence-hibernate</artifactId> <version>2.4.0</version> </dependency> 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(); } }