Repository navigation
Move the Conductor client out to dev.dbos:transact-enterprise - #632
Merged
Merged
Conversation
The Conductor client (conductor/Conductor.java) and its protocol package (conductor/protocol) leave this module for the closed-source dev.dbos:transact-enterprise artifact, which registers it through the ConductorProvider service. This module keeps the provider interface, the Conductor config keys and the launch-time lookup: a Conductor key or DBOS__CLOUD=true without dev.dbos:transact-enterprise fails launch, naming the artifact to add. No public symbol outside the conductor packages, config key or on-disk write changes. - BundledConductorProvider and its META-INF/services registration are gone. - The deprecated admin server used two protocol classes, WorkflowsOutput and StringOrListDeserializer; it now has package-private copies in dev.dbos.transact.admin. - ConductorTest, ImportExportTypeRoundTripTest and TestWebSocketServer move with the client. - Tests that launch with Conductor use TestConductorProvider, a test-only provider that connects to nothing and records each connection's options. cloudAutoStartsConductor now checks that the DBOS__CONDUCTOR_* variables reach the provider; the websocket connection itself is tested with the client. - Java-WebSocket, used only by those tests, is no longer a test dependency.
Tests run in parallel and share the provider's record of created connections, so a test looks for its own launch's options rather than clearing the record.
On DBOS Cloud the executor connects only when the platform sets DBOS__CONDUCTOR_APP_NAME, DBOS__CONDUCTOR_KEY and DBOS__CONDUCTOR_URL, but launch required dev.dbos:transact-enterprise whenever DBOS__CLOUD was true. A Cloud application without those settings would fail to launch for want of a client it would never use. The executor now works out its Conductor options in the constructor and loads a provider only when there are options. The Conductor key in DBOSConfig and the Spring starter's dbos.conductor.key now say that connecting needs dev.dbos:transact-enterprise.
The round-trip tests left with the Conductor client, but what they check is SystemDatabase's export and import: a debounced workflow comes back debounced, payloads read from the workflow_status columns import into the payload tables, and inputs, outputs and errors keep their Java types. They now hand the exported records straight to import.
Contributor
There was a problem hiding this comment.
🔵 Needs a closer look
Enterprise-provider compatibility and coordinated publication require human verification beyond the core-only test provider.
1 open issue
What changed in this PR
Moves the Conductor client out of core into dev.dbos:transact-enterprise, using the provider interface introduced in #626.
Changes:
- Removes the bundled client, protocol classes, service registration, and WebSocket test dependency.
- Requires a provider only when connection settings are available; documents the enterprise dependency.
- Keeps admin helpers local and adapts core tests to a test provider and direct export/import.
| File | Description |
|---|---|
| transact/src/test/resources/META-INF/services/dev.dbos.transact.conductor.ConductorProvider | Registers the test provider. |
| transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTestAccess.java | Exposes connection options for tests. |
| transact/src/test/java/dev/dbos/transact/database/ImportExportRoundTripTest.java | Retains direct database round-trip coverage. |
| transact/src/test/java/dev/dbos/transact/config/ConfigEnvTest.java | Tests Cloud connection configuration. |
| transact/src/test/java/dev/dbos/transact/conductor/TestWebSocketServer.java | Removes WebSocket test infrastructure. |
| transact/src/test/java/dev/dbos/transact/conductor/TestConductorProvider.java | Adds a recording, nonconnecting provider. |
| transact/src/test/java/dev/dbos/transact/conductor/ConductorProvidersTest.java | Uses the test provider. |
| transact/src/main/resources/META-INF/services/dev.dbos.transact.conductor.ConductorProvider | Removes bundled provider registration. |
| transact/src/main/java/dev/dbos/transact/execution/DBOSExecutor.java | Loads providers only with connection options. |
| transact/src/main/java/dev/dbos/transact/config/DBOSConfig.java | Documents the enterprise dependency. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/WorkflowOutputsResponse.java | Removes workflow-list response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/TriggerScheduleResponse.java | Removes schedule-trigger response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/TriggerScheduleRequest.java | Removes schedule-trigger request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/SuccessResponse.java | Removes success response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/SetLatestApplicationVersionRequest.java | Removes version-update request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ScheduleOutput.java | Removes schedule output type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/RewindWorkflowRequest.java | Removes workflow-rewind request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/RetentionRequest.java | Removes retention request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ResumeScheduleRequest.java | Removes schedule-resume request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ResumeRequest.java | Removes workflow-resume request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/RestartRequest.java | Removes workflow-restart request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/RecoveryRequest.java | Removes recovery request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/QueueOutput.java | Removes queue output type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/PauseScheduleRequest.java | Removes schedule-pause request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/MessageType.java | Removes protocol message enumeration. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListWorkflowsRequest.java | Removes workflow-list request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListStepsResponse.java | Removes step-list response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListStepsRequest.java | Removes step-list request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListSchedulesResponse.java | Removes schedule-list response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListSchedulesRequest.java | Removes schedule-list request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListQueuesResponse.java | Removes queue-list response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListQueuesRequest.java | Removes queue-list request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListQueuedWorkflowsRequest.java | Removes queued-workflow request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListApplicationVersionsResponse.java | Removes version-list response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ListApplicationVersionsRequest.java | Removes version-list request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ImportWorkflowRequest.java | Removes workflow-import request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowStreamsResponse.java | Removes workflow-stream response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowStreamsRequest.java | Removes workflow-stream request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowResponse.java | Removes workflow response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowRequest.java | Removes workflow request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowNotificationsResponse.java | Removes notification response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowNotificationsRequest.java | Removes notification request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowEventsResponse.java | Removes workflow-event response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowEventsRequest.java | Removes workflow-event request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowAggregatesResponse.java | Removes workflow-aggregate response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetWorkflowAggregatesRequest.java | Removes workflow-aggregate request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetStepAggregatesResponse.java | Removes step-aggregate response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetStepAggregatesRequest.java | Removes step-aggregate request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetScheduleResponse.java | Removes schedule response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetScheduleRequest.java | Removes schedule request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetQueueResponse.java | Removes queue response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetQueueRequest.java | Removes queue request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetMetricsResponse.java | Removes metrics response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/GetMetricsRequest.java | Removes metrics request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ForkWorkflowResponse.java | Removes workflow-fork response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ForkWorkflowRequest.java | Removes workflow-fork request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ForkFromFailureResponse.java | Removes failure-fork response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ForkFromFailureRequest.java | Removes failure-fork request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ExportWorkflowResponse.java | Removes workflow-export response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ExportWorkflowRequest.java | Removes workflow-export request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ExistPendingWorkflowsResponse.java | Removes pending-workflow response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ExistPendingWorkflowsRequest.java | Removes pending-workflow request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ExecutorInfoResponse.java | Removes executor-info response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/ExecutorInfoRequest.java | Removes executor-info request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/DeleteRequest.java | Removes deletion request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/CancelRequest.java | Removes cancellation request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/BaseResponse.java | Removes shared response envelope. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/BaseMessage.java | Removes shared request envelope. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/BackfillScheduleResponse.java | Removes backfill response type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/BackfillScheduleRequest.java | Removes backfill request type. |
| transact/src/main/java/dev/dbos/transact/conductor/protocol/AlertRequest.java | Removes alert request type. |
| transact/src/main/java/dev/dbos/transact/conductor/Conductor.java | Removes the bundled client implementation. |
| transact/src/main/java/dev/dbos/transact/conductor/BundledConductorProvider.java | Removes the bundled provider. |
| transact/src/main/java/dev/dbos/transact/admin/WorkflowsOutput.java | Keeps workflow output package-private in admin. |
| transact/src/main/java/dev/dbos/transact/admin/StringOrListDeserializer.java | Keeps deserialization helper package-private in admin. |
| transact/src/main/java/dev/dbos/transact/admin/ListWorkflowsRequest.java | Uses the local admin deserializer. |
| transact/src/main/java/dev/dbos/transact/admin/ListQueuedWorkflowsRequest.java | Uses the local admin deserializer. |
| transact/src/main/java/dev/dbos/transact/admin/AdminServer.java | Uses the local admin output type. |
| transact/build.gradle.kts | Removes WebSocket test dependency. |
| transact-spring-boot-starter/src/main/java/dev/dbos/transact/spring/DBOSProperties.java | Documents the enterprise dependency. |
| gradle/libs.versions.toml | Removes WebSocket dependency catalog entries. |
Review effort: Balanced
This module's test provider is always on the class path, so a launch that loaded one anyway would still find it, and the null options alone would not catch it. The test now also checks the executor holds no provider.
This was referenced Oct 20, 2026
Closed
devhawk
added a commit
that referenced
this pull request
Oct 20, 2026
…Test (#634) Fixes #633. Four tests in `NotificationServiceTest` (`basic_send_recv` and three others with the same shape) wait only on the receiving workflow, then assert that both workflows are SUCCESS. The receiver can finish as soon as the sender's `send` step commits the message, which is before the sender records SUCCESS. On a slow runner the sender was still PENDING, as in the On Push run for #632, where the failure skipped that commit's publish. Each test now calls `handle2.getResult()` before the status asserts. This is a test-only change. The other tests that assert a second handle is SUCCESS (`DynamicQueuesTest`, `StaticQueuesTest`, `ForkTest`) already wait on it first. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

The Conductor client moves out of this module into the closed-source
dev.dbos:transact-enterpriseartifact (dbos-inc/dbos-enterprise-java). Core already finds its client through theConductorProviderservice (#626). The enterprise artifact now registers the only implementation.What moves
conductor/Conductor.javaand theconductor/protocolpackage are removed, along withBundledConductorProviderand itsMETA-INF/servicesregistration.ConductorTest,TestWebSocketServerand the Java-WebSocket test dependency go with the client.WorkflowsOutputandStringOrListDeserializer. It now has package-private copies indev.dbos.transact.admin.No public symbol, config key or on-disk write changes outside the
conductorpackages.ConductorProvider,ConductorConnection,ConductorOptionsandConductorProvidersstay.When a provider is required
Launch requires exactly one provider only when the application will connect, and otherwise fails naming the artifact and version to add. The application connects when:
DBOS__CLOUD=true), whenDBOS__CONDUCTOR_APP_NAME,DBOS__CONDUCTOR_KEYandDBOS__CONDUCTOR_URLare all set.Before this change, any
DBOS__CLOUD=truelaunch required a provider, even one that would never connect. The executor now works out its Conductor options in the constructor and loads a provider only when there are options. TheconductorKeyjavadoc inDBOSConfigand the Spring starter'sdbos.conductor.keysay the enterprise artifact is needed.Tests
TestConductorProvider, a test-only provider that connects to nothing and records the options of each connection.cloudAutoStartsConductorchecks that theDBOS__CONDUCTOR_*variables reach the provider.cloudWithoutConductorSettingsDoesNotConnectchecks that a Cloud launch without them needs no provider.database/ImportExportRoundTripTestkeeps the export/import round-trip tests in core and passes the exported records straight to import:workflow_statuscolumns import into the payload tables;Merging
The paired enterprise PR adds the client. Merge this first, then the enterprise PR once this repo's
Publishrun has finished: enterprise's publish compiles against the newest core build on GitHub Packages. Between this publish and the enterprise one, an application that resolves both artifacts with+has no Conductor client.Applications that connect to Conductor, including DBOS Cloud apps with Conductor settings, must add
dev.dbos:transact-enterprisewhen they upgrade. This belongs in the 1.3 release notes.🤖 Generated with Claude Code