Skip to content

Commit

Permalink
Add UpdatableTimer example
Browse files Browse the repository at this point in the history
  • Loading branch information
taonic committed Jul 8, 2024
1 parent 5d12aa3 commit eb1024b
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/bin/worker
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
22 changes: 22 additions & 0 deletions examples/spec/integration/updatable_timer_spec.rb
Original file line number Diff line number Diff line change
@@ -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
39 changes: 39 additions & 0 deletions examples/workflows/updatable_timer.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit eb1024b

Please sign in to comment.