Skip to content

Klawru/r2dbc-scheduler

Repository files navigation

r2dbc-scheduler

Quality Gate Status pipeline coverage license

This is a reactive task scheduler inspired by the db-scheduler project. Tasks are stored in persistent storage using R2DBC and Spring DatabaseClient.

Installing

Maven configuration

Artifacts can be found in Maven Central:

<dependency>
    <groupId>io.gitlab.klawru</groupId>
    <artifactId>r2dbc-scheduler-spring-boot-starter</artifactId>
    <version>${version}</version>
</dependency>

Usage with Spring

  1. Add maven dependency
<dependency>
    <groupId>io.gitlab.klawru</groupId>
    <artifactId>r2dbc-scheduler-spring-boot-starter</artifactId>
    <version>${version}</version>
</dependency>
  1. create table scheduled_job. See table definition for postgresql

  2. Create bean with task

@Configuration
public class TaskConfig {

    @Bean
    RecurringTask<Void> updateObjects(Service service, OneTimeTask<UUID> updateObject) {
        return Tasks.recurring("updateObjects",
                        new CronScheduler("0 0 1 * * *", ZoneId.of("UTC")))
                .execute(((taskInstance, executionContext) -> service.scheduleUpdateAll(executionContext, updateObject)));
    }

    @Bean
    OneTimeTask<UUID> updateObject(Service service) {
        return Tasks.oneTime("updateObject", UUID.class)
                .execute(service::updateById);
    }

}

Manual usage

  1. Add a dependency to the project
<dependency>
    <groupId>io.gitlab.klawru</groupId>
    <artifactId>r2dbc-scheduler</artifactId>
    <version>${version}</version>
</dependency>
  1. create table scheduled_job. See table definition for postgresql

  2. Create the necessary tasks

class Tasks {
    OneTimeTask<String> task = new OneTimeTaskBuilder<>("taskName", String.class)
            .execute((taskInstance, context) -> Mono.fromRunnable(() -> {
                String data = taskInstance.getData();
                log.info(data);
            }));
}
  1. Create a task scheduler, and register task
class Scheduler {
    SchedulerClient client = SchedulerBuilder.create(connectionFactory, task, everyHourTask)
            .schedulerConfig(schedulerConfigBuilder -> schedulerConfigBuilder
                    .schedulerName("name")
                    .threads(2)
            )
            .build();
}
  1. Start the task scheduler
client.start();
  1. And then you can schedule the task via the SchedulerClient
scheduler.schedule(taskA.instance("1"));

Authors

Contributor names and contact info

Version History

  • 0.1.0
    • Initial Release

License

This project is licensed under the Apache License Version 2.0 — see the LICENSE file for details

Acknowledgments