Skip to content

Commit b13bd3e

Browse files
authored
Improve WF Schedule API (#350)
Pass a WorkflowSchedule object to createSchedule instead of a bunch of parameters
1 parent 4c07dd6 commit b13bd3e

8 files changed

Lines changed: 262 additions & 256 deletions

File tree

transact/src/main/java/dev/dbos/transact/DBOS.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import java.lang.reflect.Method;
3333
import java.time.Duration;
3434
import java.time.Instant;
35-
import java.time.ZoneId;
3635
import java.util.Collection;
3736
import java.util.HashSet;
3837
import java.util.Iterator;
@@ -820,25 +819,8 @@ public void setLatestApplicationVersion(@NonNull String versionName) {
820819
*
821820
* @param schedule the schedule configuration
822821
*/
823-
public void createSchedule(
824-
@NonNull String scheduleName,
825-
@NonNull String workflowName,
826-
@NonNull String className,
827-
@NonNull String schedule,
828-
@Nullable Object context,
829-
boolean backfill,
830-
@Nullable ZoneId cronTimeZone,
831-
@Nullable String queueName) {
832-
ensureLaunched("createSchedule")
833-
.createSchedule(
834-
scheduleName,
835-
workflowName,
836-
className,
837-
schedule,
838-
context,
839-
backfill,
840-
cronTimeZone,
841-
queueName);
822+
public void createSchedule(@NonNull WorkflowSchedule schedule) {
823+
ensureLaunched("createSchedule").createSchedule(schedule);
842824
}
843825

844826
/**

transact/src/main/java/dev/dbos/transact/DBOSClient.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import java.time.Duration;
2222
import java.time.Instant;
23-
import java.time.ZoneId;
2423
import java.util.Iterator;
2524
import java.util.List;
2625
import java.util.Map;
@@ -891,25 +890,8 @@ public void setLatestApplicationVersion(@NonNull String versionName) {
891890
*
892891
* @param schedule the schedule configuration
893892
*/
894-
public void createSchedule(
895-
@NonNull String scheduleName,
896-
@NonNull String workflowName,
897-
@NonNull String className,
898-
@NonNull String schedule,
899-
@Nullable Object context,
900-
boolean backfill,
901-
@Nullable ZoneId cronTimeZone,
902-
@Nullable String queueName) {
903-
DBOSExecutor.createSchedule(
904-
scheduleName,
905-
workflowName,
906-
className,
907-
schedule,
908-
context,
909-
backfill,
910-
cronTimeZone,
911-
queueName,
912-
systemDatabase::createSchedule);
893+
public void createSchedule(@NonNull WorkflowSchedule schedule) {
894+
systemDatabase.createSchedule(schedule);
913895
}
914896

915897
/**

transact/src/main/java/dev/dbos/transact/database/SchedulesDAO.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.dbos.transact.database;
22

3+
import dev.dbos.transact.execution.SchedulerService;
34
import dev.dbos.transact.json.DBOSSerializer;
45
import dev.dbos.transact.json.SerializationUtil;
56
import dev.dbos.transact.workflow.ScheduleStatus;
@@ -42,6 +43,16 @@ void createSchedule(WorkflowSchedule schedule) throws SQLException {
4243
static void createSchedule(
4344
Connection conn, String schema, DBOSSerializer serializer, WorkflowSchedule schedule)
4445
throws SQLException {
46+
47+
Objects.requireNonNull(schedule, "schedule must not be null");
48+
Objects.requireNonNull(schedule.scheduleName(), "scheduleName must not be null");
49+
Objects.requireNonNull(schedule.workflowName(), "workflowName must not be null");
50+
// Note, class name may be null since we may be creating portable schedules in a different
51+
// language
52+
Objects.requireNonNull(schedule.status(), "status must not be null");
53+
Objects.requireNonNull(schedule.cron(), "cron must not be null");
54+
SchedulerService.CRON_PARSER.parse(schedule.cron());
55+
4556
String sql =
4657
"""
4758
INSERT INTO "%s".workflow_schedules
@@ -65,7 +76,7 @@ static void createSchedule(
6576
ps.setString(3, schedule.workflowName());
6677
ps.setString(4, schedule.className());
6778
ps.setString(5, schedule.cron());
68-
ps.setString(6, Objects.requireNonNull(schedule.status()).name());
79+
ps.setString(6, schedule.status().name());
6980
ps.setString(7, serializedContext.serializedValue());
7081
ps.setString(8, schedule.lastFiredAt() != null ? schedule.lastFiredAt().toString() : null);
7182
ps.setBoolean(9, schedule.automaticBackfill());

transact/src/main/java/dev/dbos/transact/execution/DBOSExecutor.java

Lines changed: 11 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import java.lang.reflect.InvocationTargetException;
5252
import java.time.Duration;
5353
import java.time.Instant;
54-
import java.time.ZoneId;
5554
import java.time.ZoneOffset;
5655
import java.util.ArrayList;
5756
import java.util.Collection;
@@ -72,7 +71,6 @@
7271
import java.util.concurrent.TimeUnit;
7372
import java.util.concurrent.atomic.AtomicBoolean;
7473
import java.util.concurrent.atomic.AtomicReference;
75-
import java.util.function.Consumer;
7674
import java.util.function.Supplier;
7775
import java.util.stream.Collectors;
7876

@@ -936,70 +934,19 @@ public void setLatestApplicationVersion(String versionName) {
936934
systemDatabase.updateApplicationVersionTimestamp(versionName, Instant.now());
937935
}
938936

939-
public static void createSchedule(
940-
@NonNull String scheduleName,
941-
@NonNull String workflowName,
942-
@NonNull String className,
943-
@NonNull String schedule,
944-
@Nullable Object context,
945-
boolean automaticBackfill,
946-
@Nullable ZoneId cronTimeZone,
947-
@Nullable String queueName,
948-
@NonNull Consumer<WorkflowSchedule> scheduleConsumer) {
949-
Objects.requireNonNull(scheduleName, "scheduleName cannot be null");
950-
Objects.requireNonNull(workflowName, "workflowName cannot be null");
951-
Objects.requireNonNull(className, "className cannot be null");
952-
// validate schedule CRON
953-
SchedulerService.CRON_PARSER.parse(Objects.requireNonNull(schedule, "schedule cannot be null"));
954-
955-
final var wfSchedule =
956-
new WorkflowSchedule(
957-
UUID.randomUUID().toString(),
958-
scheduleName,
959-
workflowName,
960-
className,
961-
schedule,
962-
ScheduleStatus.ACTIVE,
963-
context,
964-
null,
965-
automaticBackfill,
966-
cronTimeZone,
967-
queueName);
937+
public void createSchedule(@NonNull WorkflowSchedule schedule) {
968938

969-
scheduleConsumer.accept(wfSchedule);
970-
}
971-
972-
public void createSchedule(
973-
@NonNull String scheduleName,
974-
@NonNull String workflowName,
975-
@NonNull String className,
976-
@NonNull String schedule,
977-
@Nullable Object context,
978-
boolean automaticBackfill,
979-
@Nullable ZoneId cronTimeZone,
980-
@Nullable String queueName) {
939+
Objects.requireNonNull(schedule, "schedule cannot be null");
940+
validateQueue(schedule.queueName());
941+
validateWorkflow(schedule.workflowName(), schedule.className());
981942

982-
validateQueue(queueName);
983-
validateWorkflow(workflowName, className);
984-
985-
DBOSExecutor.createSchedule(
986-
scheduleName,
987-
workflowName,
988-
className,
989-
schedule,
990-
context,
991-
automaticBackfill,
992-
cronTimeZone,
993-
queueName,
994-
wfSchedule -> {
995-
this.callFunctionAsStep(
996-
() -> {
997-
systemDatabase.createSchedule(wfSchedule);
998-
return null;
999-
},
1000-
"DBOS.createSchedule",
1001-
null);
1002-
});
943+
this.callFunctionAsStep(
944+
() -> {
945+
systemDatabase.createSchedule(schedule);
946+
return null;
947+
},
948+
"DBOS.createSchedule",
949+
null);
1003950
}
1004951

1005952
public Optional<WorkflowSchedule> getSchedule(String name) {

0 commit comments

Comments
 (0)