From de7d42533b0b4f83bd57591cfb9cab2d29809fb8 Mon Sep 17 00:00:00 2001 From: nadvolod <2136245+nadvolod@users.noreply.github.com> Date: Sat, 14 Nov 2026 13:00:24 -0500 Subject: [PATCH] Sync Temporal Essentials (Java) with the source Deck at d9fbfcb - Opening retold as one bank transfer: happy path, production failures, the retry helper, the plumbing version, then the same two lines on Temporal with a non-retryable InsufficientFundsException. New why snippets and WhyTemporalTest replace the order-fulfilment ones. - Reorder: Design patterns after Activities; "Keep it in the Workflow" moves into 05-workflows; Resumable Activity moves to the end of 11-updates; the idempotency key slide closes the Saga section. - New slides: "What is a Worker?", "Idempotency key best practices", and "A compensation Activity" (sagacompensation snippets and test). - Saga Implementation is now a pseudocode walkthrough; the unwind slide carries the real Java. "An idempotent compensation" and "Related" cut. - Resumable console drops the typo Signal and ends COMPLETED; the Workflow sets the status and ResumableTest queries it. - WorkflowRun captions, 06b step 9, CopyLink on lab slides, all labs behind one invite link, "Foundations" off the cover subtitle. - WalkthroughsTest accepts txt blocks for pseudocode walkthroughs. - ADR 0004 records the sync; cost record in docs/authoring. Co-Authored-By: Claude Opus 5.5 --- README.md | 2 +- decks/java-master/components/CopyLink.vue | 82 ++ .../components/ResumableTransfer.vue | 31 +- decks/java-master/components/WorkflowRun.vue | 13 +- decks/java-master/segments/01-why-temporal.md | 893 ++++++++++-------- .../segments/04-design-patterns.md | 211 ----- decks/java-master/segments/05-workflows.md | 214 +++++ .../java-master/segments/06b-event-history.md | 10 +- decks/java-master/segments/07-workers.md | 34 + decks/java-master/segments/11-updates.md | 201 ++++ .../segments/17-saga-01-overview.md | 2 +- .../segments/17-saga-03-implementation.md | 120 +-- .../segments/17-saga-04-when-to-register.md | 78 ++ .../segments/17-saga-06-practices.md | 39 - .../segments/17-saga-07-related.md | 107 ++- .../17b-patterns-and-anti-patterns.md | 256 +---- decks/java-master/slides.md | 25 +- .../antipatterns/DebitActivitiesImpl.java | 2 +- .../patterns4/ClaimWorkflowImpl.java | 2 +- .../patterns4/FollowUpWorkflowImpl.java | 2 +- .../patterns4/LoanWorkflowImpl.java | 2 +- .../patterns4/RiskWorkflowImpl.java | 2 +- .../patterns4/TriageWorkflowImpl.java | 2 +- .../essentials/resumable/ResumableDemo.java | 2 +- .../resumable/TransferWorkflowImpl.java | 4 +- .../essentials/saga/OrderActivitiesImpl.java | 2 - .../saga/OrderFulfillmentWorkflowImpl.java | 2 +- .../ChargeThenRefundWorkflow.java | 12 + .../ChargeThenRefundWorkflowImpl.java | 37 + .../sagacompensation/PaymentActivities.java | 12 + .../PaymentActivitiesImpl.java | 22 + .../sagacompensation/PaymentApi.java | 42 + .../temporal/devdays/essentials/why/Bank.java | 43 + ...entActivities.java => BankActivities.java} | 6 +- .../essentials/why/BankActivitiesImpl.java | 18 + .../why/FulfillmentActivitiesImpl.java | 17 - .../why/FulfillmentWorkflowImpl.java | 24 - .../devdays/essentials/why/HandRolled.java | 40 + .../essentials/why/HandRolledRetry.java | 59 -- .../why/InsufficientFundsException.java | 11 + .../devdays/essentials/why/Services.java | 62 -- .../devdays/essentials/why/Transfer.java | 4 + ...entWorkflow.java => TransferWorkflow.java} | 4 +- .../essentials/why/TransferWorkflowImpl.java | 28 + .../antipatterns/AntipatternsTest.java | 5 +- .../essentials/deck/WalkthroughsTest.java | 5 +- .../patterns4/DesignPatternsTest.java | 8 +- .../essentials/resumable/ResumableTest.java | 7 +- .../devdays/essentials/saga/SagaTest.java | 9 - .../SagaCompensationTest.java | 63 ++ .../essentials/why/WhyTemporalTest.java | 88 +- ...s-is-java-master-ported-from-typescript.md | 8 + docs/authoring/java-master-deck-sync.md | 29 + docs/authoring/java-master-log.md | 9 + 54 files changed, 1772 insertions(+), 1240 deletions(-) create mode 100644 decks/java-master/components/CopyLink.vue create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/sagacompensation/ChargeThenRefundWorkflow.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/sagacompensation/ChargeThenRefundWorkflowImpl.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/sagacompensation/PaymentActivities.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/sagacompensation/PaymentActivitiesImpl.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/sagacompensation/PaymentApi.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/Bank.java rename decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/{FulfillmentActivities.java => BankActivities.java} (68%) create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/BankActivitiesImpl.java delete mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/FulfillmentActivitiesImpl.java delete mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/FulfillmentWorkflowImpl.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/HandRolled.java delete mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/HandRolledRetry.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/InsufficientFundsException.java delete mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/Services.java create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/Transfer.java rename decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/{FulfillmentWorkflow.java => TransferWorkflow.java} (78%) create mode 100644 decks/java-master/snippets/src/main/java/io/temporal/devdays/essentials/why/TransferWorkflowImpl.java create mode 100644 decks/java-master/snippets/src/test/java/io/temporal/devdays/essentials/sagacompensation/SagaCompensationTest.java create mode 100644 docs/authoring/java-master-deck-sync.md diff --git a/README.md b/README.md index daed93b..366741f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ All created via code. Use or repurpose the content to fit your next Dev Day! | Child Workflows | Foundations | Java · child workflows | [`segments/14-child-workflows.md`](decks/java-master/segments/14-child-workflows.md) | [`workshops/child-workflows/`](workshops/child-workflows/) | [`child-workflows-java`](https://play.instruqt.com/temporal/tracks/child-workflows-java) | 15 min | Nikolay Advolodkin | Opus 5.5 (100%) | Pending | 3.98 | | Continue-As-New | Advanced | Java · event history | [`segments/15-continue-as-new.md`](decks/java-master/segments/15-continue-as-new.md) | [`workshops/continue-as-new-subscription/`](workshops/continue-as-new-subscription/) | [`continue-as-new-java`](https://play.instruqt.com/temporal/tracks/continue-as-new-java) | 10 min | Nikolay Advolodkin | Opus 5.5 (100%) | Pending | 2.86 | | Activity Heartbeats | Advanced | Java · activities | [`segments/16-heartbeating.md`](decks/java-master/segments/16-heartbeating.md) | [`workshops/heartbeats-shipment/`](workshops/heartbeats-shipment/) | [`heartbeats-java`](https://play.instruqt.com/temporal/tracks/heartbeats-java) | 10 min | Nikolay Advolodkin | Opus 5.5 (100%) | Pending | 4.45 | -| Temporal Essentials | Foundations | Java · Workflows, Activities, Workers, Clients, Signals, Queries, Updates, Sagas, versioning, timeouts and retries, observability | [`decks/java-master/`](decks/java-master/) | Deck only; code slides proven in [`snippets/`](decks/java-master/snippets/) | per section, linked in the Deck | Pending | Nikolay Advolodkin | Opus 5.5 (100%) | [112.15](docs/authoring/java-master-deck.md) | — | +| Temporal Essentials | Foundations | Java · Workflows, Activities, Workers, Clients, Signals, Queries, Updates, Sagas, versioning, timeouts and retries, observability | [`decks/java-master/`](decks/java-master/) | Deck only; code slides proven in [`snippets/`](decks/java-master/snippets/) | one invite link for every lab, in the Deck | Pending | Nikolay Advolodkin | Opus 5.5 (100%) | [112.15](docs/authoring/java-master-deck.md) | — | **Temporal Essentials is a Deck, not a Workshop**: it has no Track, Exercise or Solution of its own, so its Track cost is a dash. It is the Foundations Deck diff --git a/decks/java-master/components/CopyLink.vue b/decks/java-master/components/CopyLink.vue new file mode 100644 index 0000000..bdedb0e --- /dev/null +++ b/decks/java-master/components/CopyLink.vue @@ -0,0 +1,82 @@ + + + + + + diff --git a/decks/java-master/components/ResumableTransfer.vue b/decks/java-master/components/ResumableTransfer.vue index d7f615b..b15d8ad 100644 --- a/decks/java-master/components/ResumableTransfer.vue +++ b/decks/java-master/components/ResumableTransfer.vue @@ -4,16 +4,18 @@ - Slide clicks step through the four engineer actions (the slide needs - `clicks: 4`), so arrow keys and a clicker work; each button jumps to its - action, and the next one is outlined. Each step shows the CLI command an + Slide clicks step through the three engineer actions (the slide needs + `clicks: 3`), so arrow keys and a clicker work; each button jumps to its + action. The action just performed is outlined, so the button always matches + the terminal and the Events beside it; before the first click, a dashed + outline points at action 1. Each step shows the CLI command an engineer would run, its output, and the Events it adds. Workflow Task events are left out, as the UI's compact view does. Everything here matches the resumable package in snippets/ (TransferWorkflowImpl.java, TransferActivitiesImpl.java) and what ResumableTest checks: one attempt on a non-retryable failure, a Query that - adds nothing to history, a malformed fix that is recorded but ignored, both - Signals in history, the Java SDK's default type names (TransferWorkflow, - ExecuteTransfer), and one Workflow run from start to finish. + adds nothing to history, a COMPLETED status at the end, the Java SDK's + default type names (TransferWorkflow, ExecuteTransfer), and one Workflow run + from start to finish. -->