From eb1024b9d3c9dc87eb9d6e62745196a0c9f59879 Mon Sep 17 00:00:00 2001 From: Tao Guo Date: Fri, 5 Jul 2024 15:45:41 +1000 Subject: [PATCH] Add UpdatableTimer example --- examples/bin/worker | 1 + .../spec/integration/updatable_timer_spec.rb | 22 +++++++++++ examples/workflows/updatable_timer.rb | 39 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 examples/spec/integration/updatable_timer_spec.rb create mode 100644 examples/workflows/updatable_timer.rb diff --git a/examples/bin/worker b/examples/bin/worker index be6f2b97..59837a38 100755 --- a/examples/bin/worker +++ b/examples/bin/worker @@ -71,6 +71,7 @@ worker.register_workflow(SlowChildWorkflow) worker.register_workflow(StartChildWorkflowWorkflow) worker.register_workflow(TimeoutWorkflow) worker.register_workflow(TripBookingWorkflow) +worker.register_workflow(UpdatableTimer) worker.register_workflow(UpsertSearchAttributesWorkflow) worker.register_workflow(WaitForWorkflow) worker.register_workflow(WaitForExternalSignalWorkflow) diff --git a/examples/spec/integration/updatable_timer_spec.rb b/examples/spec/integration/updatable_timer_spec.rb new file mode 100644 index 00000000..774fa942 --- /dev/null +++ b/examples/spec/integration/updatable_timer_spec.rb @@ -0,0 +1,22 @@ +require 'workflows/updatable_timer' + +describe UpdatableTimer, :integration do + let(:initial_duration) { 5 } + let(:final_duration) { 1.1 } + + it 'updates timer duration via signal' do + workflow_id, run_id = run_workflow(UpdatableTimer, initial_duration) + Temporal.signal_workflow(UpdatableTimer, 'update_timer', workflow_id, run_id, 3) + Temporal.signal_workflow(UpdatableTimer, 'update_timer', workflow_id, run_id, final_duration) + + e2e_duration = Temporal.await_workflow_result( + UpdatableTimer, + workflow_id: workflow_id, + run_id: run_id, + ) + + latency_tolerance = 0.2 + expect(e2e_duration).to be > final_duration + expect(e2e_duration).to be < final_duration + latency_tolerance + end +end diff --git a/examples/workflows/updatable_timer.rb b/examples/workflows/updatable_timer.rb new file mode 100644 index 00000000..cdedacc7 --- /dev/null +++ b/examples/workflows/updatable_timer.rb @@ -0,0 +1,39 @@ +class UpdatableTimer < Temporal::Workflow + def execute(sleep_duration) + started_at = workflow.now + execute_in_timer(workflow, sleep_duration) do + workflow.logger.info('Executing workflow') + workflow.now - started_at + end + end + + def execute_in_timer(workflow, sleep_duration, &blk) + signal_received = false + + workflow.on_signal('update_timer') do |new_duration| + workflow.logger.info("Received update_timer signal with new duration: #{new_duration}") + sleep_duration = new_duration + signal_received = true + end + + while sleep_duration > 0 + signal_received = false + + timer = workflow.start_timer(sleep_duration) + workflow.logger.info("Started timer with duration: #{sleep_duration}s") + + workflow.wait_until do + timer.finished? || signal_received + end + + if timer.finished? + workflow.logger.info("Timer fired") + break + end + + timer.cancel + end + + yield + end +end