Skip to content

feat(java): idempotent, dependsOn, notes, circuit breakers#383

Merged
pratyush618 merged 9 commits into
masterfrom
feat/java-phantom-parity
Jul 7, 2026
Merged

feat(java): idempotent, dependsOn, notes, circuit breakers#383
pratyush618 merged 9 commits into
masterfrom
feat/java-phantom-parity

Conversation

@pratyush618

@pratyush618 pratyush618 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

Closes four features the Java SDK was missing. Three are core-backed — the Rust core already
implements them and the JNI binding was hardcoding defaults at the seam — so the change is mostly
threading an existing field through; one is a pure SDK-side convenience. All are opt-in and
non-breaking. Also regroups the flat Java test suite into feature-area packages.

Features

  • Idempotent auto-derive@TaskHandler(idempotent = true) or EnqueueOptions.idempotent(true)
    derive a uniqueKey from the payload so a duplicate enqueue is a no-op while the first job is
    pending/running. Key = auto: + sha256(name ‖ 0x00 ‖ pre-codec payload), truncated to 32 hex
    chars — matching the cross-SDK idempotency-key contract (a golden-vector test pins it). Precedence:
    explicit uniqueKeyidempotencyKey → per-call opt-out → task/enqueue flag → auto-derive.
  • dependsOn on enqueueEnqueueOptions.dependsOn(...) gates a job on other job ids. The core
    already validates edges, gates dequeue, and cascade-cancels on a failed dependency; the binding now
    threads the field instead of discarding it.
  • Structured notesEnqueueOptions.notes(Map) attaches a bounded, validated annotation map
    (≤15 fields, ≤64-char keys, ≤500-char string leaves, ≤3 nesting, ≤4 KiB), stored as canonical JSON
    and surfaced via Job.notesMap() and the dashboard contract.
  • Per-task circuit breakersTask.circuitBreaker(...) / @TaskHandler(circuitBreaker*) register
    the core's per-task breaker (state machine + enforcement already live in the core; the binding only
    supplies config). A new listCircuitBreakers() inspection call surfaces breaker state.

Tests

  • Java: 193 tests pass. New coverage per feature — golden-vector idempotency key + precedence,
    dependency gating + cascade cancel, notes limit boundaries + storage round-trip, breaker
    open/half-open behaviour, and annotation-processor codegen for the new per-task attributes.
  • Rust: clippy clean; workspace tests pass.
  • The Java test suite is regrouped from one flat package into 11 feature-area packages (core,
    worker, workflows, serialization, codegen, resources, contrib, dashboard, cli,
    autoscale, internal), matching the layout the rest of the repo already uses.

Out of scope (follow-up)

  • Dashboard task-overrides and pluggable SSO.
  • async-tasks / prefork — no JVM analog (threads / virtual threads already fill that role).

Summary by CodeRabbit

  • New Features
    • Added per-task idempotency support for automatic deduplication, including annotation defaults and explicit idempotency keys during enqueue.
    • Added structured job notes (validated + canonical JSON) and surfaced them in job details.
    • Added per-task circuit breaker configuration plus admin/inspection to list circuit-breaker state.
    • Added dependency-aware enqueueing via dependsOn so jobs can wait for other jobs to finish.
  • Bug Fixes
    • Improved deduplication to use deterministic, pre-encoding payload bytes for stable unique keys.

@github-actions github-actions Bot added the rust label Jul 7, 2026
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 7 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0bf83125-80d1-4843-b1cc-083adb4c953f

📥 Commits

Reviewing files that changed from the base of the PR and between cae063d and d389587.

📒 Files selected for processing (9)
  • sdks/java/src/main/java/org/byteveda/taskito/DefaultTaskito.java
  • sdks/java/src/main/java/org/byteveda/taskito/serialization/Notes.java
  • sdks/java/src/main/java/org/byteveda/taskito/worker/Worker.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/DependsOnTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/IdempotencyTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/NotesTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/CircuitBreakerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/LockTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowSubWorkflowTest.java
📝 Walkthrough

Walkthrough

This PR adds circuit-breaker support, structured job notes, dependency gating, and idempotency handling across the Rust JNI layer and Java SDK, including new public configuration/state types, enqueue behavior, and inspection APIs. It also relocates existing Java tests into feature-specific packages.

Changes

Circuit breaker, notes, dependsOn, idempotency feature

Layer / File(s) Summary
Rust JNI conversion
crates/taskito-java/src/convert.rs
EnqueueOptions gains depends_on and notes; build_new_job propagates them; JobView gains notes; new CircuitBreakerView conversion is added; TaskRetryConfig gains optional circuit-breaker fields.
Rust JNI inspection and worker wiring
crates/taskito-java/src/queue/inspect.rs, crates/taskito-java/src/worker.rs
A new circuit-breaker inspection entry point is added, and worker task registration now wires circuit-breaker configuration into TaskConfig.
Java domain types
sdks/java/src/main/java/org/byteveda/taskito/task/CircuitBreakerConfig.java, .../model/CircuitBreakerState.java, .../serialization/Notes.java, .../errors/NotesValidationException.java, .../internal/IdempotencyKeys.java
New Java types provide circuit-breaker config/state, notes validation/encoding, a notes exception, and deterministic idempotency key generation.
Task and enqueue options
.../task/Task.java, .../task/EnqueueOptions.java, .../model/Job.java, .../dashboard/Contract.java
Task gains idempotent/circuitBreaker defaults; EnqueueOptions gains dependsOn, notes, idempotent, and idempotencyKey; Job gains notes; the dashboard contract includes notes.
Backend and public listing API
.../internal/NativeQueue.java, .../internal/JniQueueBackend.java, .../spi/QueueBackend.java, .../DefaultTaskito.java, .../Taskito.java
Circuit-breaker listing is exposed through native, backend, SPI, and public Java APIs.
Enqueue idempotency
.../DefaultTaskito.java
Enqueue dispatch now resolves dedup keys before codec application and threads task-level idempotent defaults through enqueue paths.
Worker task config encoding
.../worker/Worker.java
Per-task circuit-breaker settings are captured and merged with retry policy when task configs are encoded.
Annotation processor codegen
.../annotation/TaskHandler.java, processor/TaskHandlerProcessor.java
@TaskHandler gains idempotent/circuit-breaker elements, and generated task options now include matching fluent calls.
Feature tests
sdks/java/src/test/java/org/byteveda/taskito/{worker,core,codegen}/*
New tests cover circuit-breaker behavior, dependency handling, idempotency, notes validation/round-trip, and generated policies.

Java test package restructuring

Layer / File(s) Summary
Test package relocations
sdks/java/src/test/java/org/byteveda/taskito/{autoscale,codegen,contrib,core,dashboard,internal,resources,serialization,worker,workflows}/*
Existing test classes are moved into subpackages with matching import updates for Taskito, Task, TaskitoException, and Queue.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant JavaCaller
  participant NativeQueue
  participant inspect_rs
  participant Storage

  JavaCaller->>NativeQueue: listCircuitBreakers(handle)
  NativeQueue->>inspect_rs: Java_..._listCircuitBreakers
  inspect_rs->>Storage: list_circuit_breakers()
  Storage-->>inspect_rs: CircuitBreakerRow list
  inspect_rs-->>JavaCaller: JSON string of CircuitBreakerView
Loading
sequenceDiagram
  participant Caller
  participant DefaultTaskito
  participant Serializer
  participant IdempotencyKeys
  participant Backend

  Caller->>DefaultTaskito: enqueue(task, payload, options)
  DefaultTaskito->>Serializer: serialize(payload)
  Serializer-->>DefaultTaskito: payloadBytes
  DefaultTaskito->>DefaultTaskito: resolveUniqueKey(options, task.idempotent())
  DefaultTaskito->>IdempotencyKeys: autoKey(taskName, payloadBytes)
  IdempotencyKeys-->>DefaultTaskito: dedup key
  DefaultTaskito->>Backend: submit(finalOptions with uniqueKey)
Loading

Possibly related PRs

Suggested labels: tests

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the main Java SDK additions: idempotency, dependsOn, notes, and circuit breakers.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/java-phantom-parity

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (4)
sdks/java/src/main/java/org/byteveda/taskito/worker/Worker.java (1)

428-462: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider extracting policy/breaker encoding into helper methods.

The loop body mixes two independent concerns (retry-policy fields, breaker fields) in one block, which is why this segment was flagged as high complexity. Splitting into encodePolicyFields(RetryPolicy, Map) and encodeBreakerFields(CircuitBreakerConfig, Map) would keep encodeTaskConfigs() a simple orchestrator.

♻️ Proposed refactor
-                RetryPolicy policy = taskPolicies.get(name);
-                if (policy != null) {
-                    if (policy.baseDelay() != null) {
-                        config.put("baseDelayMs", policy.baseDelay().toMillis());
-                    }
-                    if (policy.maxDelay() != null) {
-                        config.put("maxDelayMs", policy.maxDelay().toMillis());
-                    }
-                    if (!policy.customDelays().isEmpty()) {
-                        List<Long> delaysMs = new ArrayList<>(policy.customDelays().size());
-                        policy.customDelays().forEach(delay -> delaysMs.add(delay.toMillis()));
-                        config.put("customDelaysMs", delaysMs);
-                    }
-                }
-                CircuitBreakerConfig breaker = taskCircuitBreakers.get(name);
-                if (breaker != null) {
-                    config.put("circuitBreakerThreshold", breaker.threshold());
-                    config.put("circuitBreakerWindowMs", breaker.window().toMillis());
-                    config.put("circuitBreakerCooldownMs", breaker.cooldown().toMillis());
-                    config.put("circuitBreakerHalfOpenProbes", breaker.halfOpenProbes());
-                    config.put("circuitBreakerHalfOpenSuccessRate", breaker.halfOpenSuccessRate());
-                }
+                encodePolicy(config, taskPolicies.get(name));
+                encodeBreaker(config, taskCircuitBreakers.get(name));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@sdks/java/src/main/java/org/byteveda/taskito/worker/Worker.java` around lines
428 - 462, Refactor the high-complexity loop in Worker.encodeTaskConfigs() by
moving the retry-policy field population and circuit-breaker field population
into separate helpers, such as encodePolicyFields(RetryPolicy, Map<String,
Object>) and encodeBreakerFields(CircuitBreakerConfig, Map<String, Object>).
Keep encodeTaskConfigs() focused on collecting task names, creating the per-task
map, and delegating to those helpers so the two concerns are encoded
independently.
crates/taskito-java/src/convert.rs (1)

222-234: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Circuit-breaker defaults duplicated with worker.rs.

The comment notes these Options "mirror the core's" defaults, but the actual default values (60_000/300_000/5/0.8) are hardcoded again in worker.rs's register_task_policies rather than sourced from taskito_core's own CircuitBreakerConfig::default(). If the core's defaults ever change, these two locations can silently drift.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/taskito-java/src/convert.rs` around lines 222 - 234, The
circuit-breaker default values are duplicated between TaskRetryConfig handling
and register_task_policies, which can drift from
taskito_core::CircuitBreakerConfig::default(). Update register_task_policies to
source the defaults from the core config instead of hardcoding the
60_000/300_000/5/0.8 values, and keep TaskRetryConfig aligned with that single
source of truth so the breaker settings stay consistent.
sdks/java/src/main/java/org/byteveda/taskito/task/CircuitBreakerConfig.java (1)

13-56: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider adding toString() for debuggability.

Config objects like this are often logged (e.g., during worker startup/policy registration). A toString() override would make debug logs and test failures easier to diagnose.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@sdks/java/src/main/java/org/byteveda/taskito/task/CircuitBreakerConfig.java`
around lines 13 - 56, Add a toString() override to CircuitBreakerConfig so the
config is readable in logs and test failures. Implement it in the
CircuitBreakerConfig class using the existing fields exposed by threshold(),
window(), cooldown(), halfOpenProbes(), and halfOpenSuccessRate(), so startup
and policy-registration debug output is more informative.
sdks/java/src/main/java/org/byteveda/taskito/task/EnqueueOptions.java (1)

37-49: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Missing notes() getter for symmetry with the other new fields.

dependsOn, idempotent, idempotencyKey, and uniqueKey all get public getters, but notes doesn't. Serialization to the native layer still works (Jackson picks up the field-level @JsonProperty via reflection), but there's no way to read the encoded notes back off an EnqueueOptions instance — e.g. for tests or middleware that want to introspect it.

♻️ Proposed fix
     /** An explicit idempotency key (used as the {`@code` uniqueKey} when set), or {`@code` null}. */
     public String idempotencyKey() {
         return idempotencyKey;
     }
+
+    /** Canonical JSON encoding of the structured notes, or {`@code` null} when none are set. */
+    public String notes() {
+        return notes;
+    }

Also applies to: 91-113

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@sdks/java/src/main/java/org/byteveda/taskito/task/EnqueueOptions.java` around
lines 37 - 49, Add a public notes() getter on EnqueueOptions to match the other
new fields and allow callers/tests to read the encoded notes value from the
object. Keep it consistent with the existing accessor pattern used for
dependsOn, idempotent, idempotencyKey, and uniqueKey, and ensure it simply
returns the notes field without changing the Jackson serialization behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@sdks/java/src/main/java/org/byteveda/taskito/DefaultTaskito.java`:
- Around line 259-291: The batched enqueue path still skips idempotent
auto-derivation, so `enqueueMany`/`enqueueAll` can drop dedup behavior even when
`idempotent(true)` is set. Update the bulk enqueue flow in `DefaultTaskito` so
each payload resolves its effective key via `resolveUniqueKey(...)` before
creating `perJob`, mirroring the single-enqueue path and preserving explicit
`uniqueKey`/`idempotencyKey` precedence.

---

Nitpick comments:
In `@crates/taskito-java/src/convert.rs`:
- Around line 222-234: The circuit-breaker default values are duplicated between
TaskRetryConfig handling and register_task_policies, which can drift from
taskito_core::CircuitBreakerConfig::default(). Update register_task_policies to
source the defaults from the core config instead of hardcoding the
60_000/300_000/5/0.8 values, and keep TaskRetryConfig aligned with that single
source of truth so the breaker settings stay consistent.

In `@sdks/java/src/main/java/org/byteveda/taskito/task/CircuitBreakerConfig.java`:
- Around line 13-56: Add a toString() override to CircuitBreakerConfig so the
config is readable in logs and test failures. Implement it in the
CircuitBreakerConfig class using the existing fields exposed by threshold(),
window(), cooldown(), halfOpenProbes(), and halfOpenSuccessRate(), so startup
and policy-registration debug output is more informative.

In `@sdks/java/src/main/java/org/byteveda/taskito/task/EnqueueOptions.java`:
- Around line 37-49: Add a public notes() getter on EnqueueOptions to match the
other new fields and allow callers/tests to read the encoded notes value from
the object. Keep it consistent with the existing accessor pattern used for
dependsOn, idempotent, idempotencyKey, and uniqueKey, and ensure it simply
returns the notes field without changing the Jackson serialization behavior.

In `@sdks/java/src/main/java/org/byteveda/taskito/worker/Worker.java`:
- Around line 428-462: Refactor the high-complexity loop in
Worker.encodeTaskConfigs() by moving the retry-policy field population and
circuit-breaker field population into separate helpers, such as
encodePolicyFields(RetryPolicy, Map<String, Object>) and
encodeBreakerFields(CircuitBreakerConfig, Map<String, Object>). Keep
encodeTaskConfigs() focused on collecting task names, creating the per-task map,
and delegating to those helpers so the two concerns are encoded independently.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bef5e141-4382-499c-8ce2-d77aad25a66b

📥 Commits

Reviewing files that changed from the base of the PR and between 321984b and 66420d6.

📒 Files selected for processing (64)
  • crates/taskito-java/src/convert.rs
  • crates/taskito-java/src/queue/inspect.rs
  • crates/taskito-java/src/worker.rs
  • sdks/java/processor/src/main/java/org/byteveda/taskito/processor/TaskHandlerProcessor.java
  • sdks/java/src/main/java/org/byteveda/taskito/DefaultTaskito.java
  • sdks/java/src/main/java/org/byteveda/taskito/Taskito.java
  • sdks/java/src/main/java/org/byteveda/taskito/annotation/TaskHandler.java
  • sdks/java/src/main/java/org/byteveda/taskito/dashboard/Contract.java
  • sdks/java/src/main/java/org/byteveda/taskito/errors/NotesValidationException.java
  • sdks/java/src/main/java/org/byteveda/taskito/internal/IdempotencyKeys.java
  • sdks/java/src/main/java/org/byteveda/taskito/internal/JniQueueBackend.java
  • sdks/java/src/main/java/org/byteveda/taskito/internal/NativeQueue.java
  • sdks/java/src/main/java/org/byteveda/taskito/model/CircuitBreakerState.java
  • sdks/java/src/main/java/org/byteveda/taskito/model/Job.java
  • sdks/java/src/main/java/org/byteveda/taskito/serialization/Notes.java
  • sdks/java/src/main/java/org/byteveda/taskito/spi/QueueBackend.java
  • sdks/java/src/main/java/org/byteveda/taskito/task/CircuitBreakerConfig.java
  • sdks/java/src/main/java/org/byteveda/taskito/task/EnqueueOptions.java
  • sdks/java/src/main/java/org/byteveda/taskito/task/Task.java
  • sdks/java/src/main/java/org/byteveda/taskito/worker/Worker.java
  • sdks/java/src/test/java/org/byteveda/taskito/autoscale/ScalerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/codegen/AnnotatedPolicies.java
  • sdks/java/src/test/java/org/byteveda/taskito/codegen/AnnotatedPolicyTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/codegen/AnnotationProcessorTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/codegen/Greeter.java
  • sdks/java/src/test/java/org/byteveda/taskito/codegen/ResourceGreeter.java
  • sdks/java/src/test/java/org/byteveda/taskito/contrib/TaskitoLoggerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/contrib/WebhookTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/DeadLetterByTaskTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/DependsOnTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/EnqueueDecisionTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/ErgonomicsTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/ExceptionHierarchyTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/IdempotencyTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/InterceptionTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/NotesTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/PredicateTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/QueueTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/core/RecipesTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/dashboard/DashboardTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/internal/FfmRoundTripTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/resources/ProxyTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/resources/ResourceTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/serialization/EncryptedGreeter.java
  • sdks/java/src/test/java/org/byteveda/taskito/serialization/MsgpackSerializerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/serialization/PayloadCodecTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/serialization/PerTaskCodecTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/BatcherTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/CircuitBreakerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/LockTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/MeshWorkerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/PeriodicTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/RetryPolicyTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/worker/WorkerTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/CanvasTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowCacheTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowConditionTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowFanOutTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowGateTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowGraphTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowSagaTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowSubWorkflowTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowSubmitMapTest.java
  • sdks/java/src/test/java/org/byteveda/taskito/workflows/WorkflowTest.java

Comment thread sdks/java/src/main/java/org/byteveda/taskito/DefaultTaskito.java
@pratyush618 pratyush618 changed the title Java SDK phantom-feature parity: idempotent, dependsOn, notes, circuit breakers feat(java): idempotent, dependsOn, notes, circuit breakers Jul 7, 2026
@pratyush618 pratyush618 self-assigned this Jul 7, 2026
@pratyush618 pratyush618 merged commit 7cce759 into master Jul 7, 2026
35 checks passed
@pratyush618 pratyush618 deleted the feat/java-phantom-parity branch July 7, 2026 06:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant