diff --git a/transact-spring-boot-starter/src/main/java/dev/dbos/transact/spring/DBOSAutoConfiguration.java b/transact-spring-boot-starter/src/main/java/dev/dbos/transact/spring/DBOSAutoConfiguration.java index 935b516c..1ae1f653 100644 --- a/transact-spring-boot-starter/src/main/java/dev/dbos/transact/spring/DBOSAutoConfiguration.java +++ b/transact-spring-boot-starter/src/main/java/dev/dbos/transact/spring/DBOSAutoConfiguration.java @@ -103,6 +103,7 @@ public DBOSWorkflowRegistrar dbosWorkflowRegistrar( return new DBOSWorkflowRegistrar(dbos, applicationContext); } + @SuppressWarnings("removal") private DBOSConfig buildConfig(DBOSProperties props, String springAppName) { String appName = props.getApplication().getName() != null ? props.getApplication().getName() : springAppName; diff --git a/transact-spring-boot-starter/src/test/java/dev/dbos/transact/spring/DBOSAutoConfigurationTest.java b/transact-spring-boot-starter/src/test/java/dev/dbos/transact/spring/DBOSAutoConfigurationTest.java index 7715ced3..0ea8cf49 100644 --- a/transact-spring-boot-starter/src/test/java/dev/dbos/transact/spring/DBOSAutoConfigurationTest.java +++ b/transact-spring-boot-starter/src/test/java/dev/dbos/transact/spring/DBOSAutoConfigurationTest.java @@ -66,6 +66,7 @@ void dbosConfigReflectsDatasourceProperties() { } @Test + @SuppressWarnings("removal") void dbosConfigReflectsOptionalProperties() { runner .withPropertyValues( diff --git a/transact/src/main/java/dev/dbos/transact/config/DBOSConfig.java b/transact/src/main/java/dev/dbos/transact/config/DBOSConfig.java index 97f5200f..ea60715b 100644 --- a/transact/src/main/java/dev/dbos/transact/config/DBOSConfig.java +++ b/transact/src/main/java/dev/dbos/transact/config/DBOSConfig.java @@ -17,6 +17,49 @@ import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; +/** + * Immutable configuration for a DBOS application instance. + * + *
Use {@link #defaults(String)} or {@link #defaultsFromEnv(String)} to obtain a base + * configuration, then chain {@code with*} methods to set individual options: + * + *
{@code
+ * DBOSConfig config = DBOSConfig.defaults("my-app")
+ * .withDatabaseUrl("jdbc:postgresql://localhost:5432/mydb")
+ * .withMigrate(true);
+ * }
+ *
+ * @param appName unique name for this application; must not be null or empty
+ * @param databaseUrl JDBC URL of the PostgreSQL database; may be {@code null} when a {@link
+ * DataSource} is provided instead
+ * @param dbUser PostgreSQL username; may be {@code null} to rely on driver defaults
+ * @param dbPassword PostgreSQL password; masked in {@link #toString()}
+ * @param dataSource pre-configured {@link DataSource} to use instead of {@code databaseUrl}, {@code
+ * dbUser}, and {@code dbPassword}
+ * @param adminServer whether to start the built-in admin HTTP server; deprecated and will be
+ * removed before 1.0 — use DBOS Conductor instead
+ * @param adminServerPort port for the built-in admin HTTP server; deprecated and will be removed
+ * before 1.0 — use DBOS Conductor instead
+ * @param migrate whether to run database migrations on startup
+ * @param conductorKey API key for DBOS Conductor; must not be empty if non-null
+ * @param conductorDomain custom hostname for DBOS Conductor; must not be empty if non-null
+ * @param conductorExecutorMetadata arbitrary key-value metadata attached to this executor's
+ * registration in Conductor
+ * @param appVersion application version string used for versioned workflow routing; must not be
+ * empty if non-null
+ * @param executorId stable identifier for this executor instance; must not be empty if non-null
+ * @param databaseSchema PostgreSQL schema used for DBOS system tables; {@code null} uses the
+ * default schema
+ * @param enablePatching whether to enable workflow patching
+ * @param listenQueues names of queues this executor should dequeue work from; an empty set means
+ * listen on all queues
+ * @param serializer custom {@link DBOSSerializer} for workflow arguments and return values; {@code
+ * null} uses the default JSON serializer
+ * @param schedulerPollingInterval how often the cron scheduler polls for due tasks; {@code null}
+ * uses the system default
+ * @param useListenNotify whether to use PostgreSQL {@code LISTEN}/{@code NOTIFY} for real-time
+ * workflow wake-ups instead of polling
+ */
public record DBOSConfig(
@NonNull String appName,
@Nullable String databaseUrl,
@@ -59,6 +102,24 @@ public record DBOSConfig(
listenQueues = (listenQueues == null) ? Set.of() : Set.copyOf(listenQueues);
}
+ /**
+ * @deprecated The built-in admin server will be removed before 1.0. Use DBOS Conductor instead.
+ */
+ @Deprecated(since = "0.9", forRemoval = true)
+ @Override
+ public boolean adminServer() {
+ return adminServer;
+ }
+
+ /**
+ * @deprecated The built-in admin server will be removed before 1.0. Use DBOS Conductor instead.
+ */
+ @Deprecated(since = "0.9", forRemoval = true)
+ @Override
+ public int adminServerPort() {
+ return adminServerPort;
+ }
+
// Copy constructor
public DBOSConfig(DBOSConfig other) {
this(
@@ -85,6 +146,16 @@ public DBOSConfig(DBOSConfig other) {
other.useListenNotify);
}
+ /**
+ * Returns a {@link DBOSConfig} with sensible defaults for the given application name.
+ *
+ * Migrations are enabled and {@code LISTEN}/{@code NOTIFY} is used for workflow wake-ups. No + * database connection details are pre-filled; supply them with {@link #withDatabaseUrl}, {@link + * #withDbUser}/{@link #withDbPassword}, or {@link #withDataSource}. + * + * @param appName unique application name; must not be null or empty + * @return a default {@link DBOSConfig} for the given name + */ public static @NonNull DBOSConfig defaults(@NonNull String appName) { return new DBOSConfig( appName, null, null, null, null, false, // adminServer @@ -93,6 +164,20 @@ public DBOSConfig(DBOSConfig other) { null, null, null, null, null, null, false, null, null, null, true); // useListenNotify } + /** + * Returns a {@link DBOSConfig} populated from standard environment variables. + * + *
Reads the following variables: + * + *
When a {@link DataSource} is provided it takes precedence over {@code databaseUrl}, {@code
+ * dbUser}, and {@code dbPassword}.
+ */
public @NonNull DBOSConfig withDataSource(@Nullable DataSource v) {
return new DBOSConfig(
appName,
@@ -219,6 +314,12 @@ public DBOSConfig(DBOSConfig other) {
useListenNotify);
}
+ /**
+ * Returns a copy of this config with {@code adminServer} set to {@code v}.
+ *
+ * @deprecated The built-in admin server will be removed before 1.0. Use DBOS Conductor instead.
+ */
+ @Deprecated(since = "0.9", forRemoval = true)
public @NonNull DBOSConfig withAdminServer(boolean v) {
return new DBOSConfig(
appName,
@@ -242,6 +343,12 @@ public DBOSConfig(DBOSConfig other) {
useListenNotify);
}
+ /**
+ * Returns a copy of this config with {@code adminServerPort} set to {@code v}.
+ *
+ * @deprecated The built-in admin server will be removed before 1.0. Use DBOS Conductor instead.
+ */
+ @Deprecated(since = "0.9", forRemoval = true)
public @NonNull DBOSConfig withAdminServerPort(int v) {
return new DBOSConfig(
appName,
@@ -265,6 +372,7 @@ public DBOSConfig(DBOSConfig other) {
useListenNotify);
}
+ /** Returns a copy of this config with {@code migrate} set to {@code v}. */
public @NonNull DBOSConfig withMigrate(boolean v) {
return new DBOSConfig(
appName,
@@ -288,6 +396,7 @@ public DBOSConfig(DBOSConfig other) {
useListenNotify);
}
+ /** Returns a copy of this config with {@code conductorKey} set to {@code v}. */
public @NonNull DBOSConfig withConductorKey(@Nullable String v) {
return new DBOSConfig(
appName,
@@ -311,6 +420,7 @@ public DBOSConfig(DBOSConfig other) {
useListenNotify);
}
+ /** Returns a copy of this config with {@code conductorDomain} set to {@code v}. */
public @NonNull DBOSConfig withConductorDomain(@Nullable String v) {
return new DBOSConfig(
appName,
@@ -334,6 +444,7 @@ public DBOSConfig(DBOSConfig other) {
useListenNotify);
}
+ /** Returns a copy of this config with {@code conductorExecutorMetadata} set to {@code v}. */
public @NonNull DBOSConfig withConductorExecutorMetadata(@Nullable Map