Skip to content

Move the Conductor client out to dev.dbos:transact-enterprise - #632

Merged
devhawk merged 5 commits into
mainfrom
move-conductor-client
Oct 20, 2026
Merged

devhawk merged 5 commits into
mainfrom
move-conductor-client

Conversation

@devhawk

@devhawk devhawk commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

The Conductor client moves out of this module into the closed-source dev.dbos:transact-enterprise artifact (dbos-inc/dbos-enterprise-java). Core already finds its client through the ConductorProvider service (#626). The enterprise artifact now registers the only implementation.

What moves

  • conductor/Conductor.java and the conductor/protocol package are removed, along with BundledConductorProvider and its META-INF/services registration.
  • ConductorTest, TestWebSocketServer and the Java-WebSocket test dependency go with the client.
  • The deprecated admin server used two protocol classes, WorkflowsOutput and StringOrListDeserializer. It now has package-private copies in dev.dbos.transact.admin.

No public symbol, config key or on-disk write changes outside the conductor packages. ConductorProvider, ConductorConnection, ConductorOptions and ConductorProviders stay.

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:

  • a Conductor key is configured; or
  • on DBOS Cloud (DBOS__CLOUD=true), when DBOS__CONDUCTOR_APP_NAME, DBOS__CONDUCTOR_KEY and DBOS__CONDUCTOR_URL are all set.

Before this change, any DBOS__CLOUD=true launch 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. The conductorKey javadoc in DBOSConfig and the Spring starter's dbos.conductor.key say the enterprise artifact is needed.

Tests

  • Tests that launch with Conductor use TestConductorProvider, a test-only provider that connects to nothing and records the options of each connection.
    • cloudAutoStartsConductor checks that the DBOS__CONDUCTOR_* variables reach the provider.
    • cloudWithoutConductorSettingsDoesNotConnect checks that a Cloud launch without them needs no provider.
  • database/ImportExportRoundTripTest keeps the export/import round-trip tests in core and passes the exported records straight to import:
    • a debounced workflow comes back debounced;
    • payloads in the old workflow_status columns import into the payload tables;
    • inputs, outputs and errors keep their Java types.

Merging

The paired enterprise PR adds the client. Merge this first, then the enterprise PR once this repo's Publish run 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-enterprise when they upgrade. This belongs in the 1.3 release notes.

🤖 Generated with Claude Code

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.
@devhawk
devhawk requested review from kraftp, maxdml and qianl15 and a balanced review from Copilot October 20, 2026 18:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 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

Comment thread transact/src/test/java/dev/dbos/transact/config/ConfigEnvTest.java Outdated
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.
@devhawk
devhawk merged commit fdedb3a into main Oct 20, 2026
12 checks passed
@devhawk
devhawk deleted the move-conductor-client branch October 20, 2026 19:53
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants