Skip to content

Commit 803ce08

Browse files
committed
Add UpdatableTimer example
1 parent d75dfee commit 803ce08

3 files changed

Lines changed: 57 additions & 0 deletions

File tree

examples/bin/worker

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ worker.register_workflow(SlowChildWorkflow)
7070
worker.register_workflow(StartChildWorkflowWorkflow)
7171
worker.register_workflow(TimeoutWorkflow)
7272
worker.register_workflow(TripBookingWorkflow)
73+
worker.register_workflow(UpdatableTimer)
7374
worker.register_workflow(UpsertSearchAttributesWorkflow)
7475
worker.register_workflow(WaitForWorkflow)
7576
worker.register_workflow(WaitForExternalSignalWorkflow)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
require 'workflows/updatable_timer'
2+
3+
describe UpdatableTimer, :integration do
4+
let(:initial_duration) { 5 }
5+
let(:final_duration) { 1.1 }
6+
7+
it 'updates timer duration via signal' do
8+
workflow_id, run_id = run_workflow(UpdatableTimer, initial_duration)
9+
Temporal.signal_workflow(UpdatableTimer, :update_timer, workflow_id, run_id, 3)
10+
Temporal.signal_workflow(UpdatableTimer, :update_timer, workflow_id, run_id, final_duration)
11+
12+
e2e_duration = Temporal.await_workflow_result(
13+
UpdatableTimer,
14+
workflow_id: workflow_id,
15+
run_id: run_id,
16+
)
17+
18+
latency_tolerance = 0.2
19+
expect(e2e_duration).to be > final_duration
20+
expect(e2e_duration).to be < final_duration + latency_tolerance
21+
end
22+
end
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class UpdatableTimer < Temporal::Workflow
2+
def execute(sleep_duration)
3+
started_at = workflow.now
4+
execute_in_timer(workflow, sleep_duration) do
5+
workflow.logger.info('Executing workflow')
6+
return workflow.now - started_at
7+
end
8+
end
9+
10+
def execute_in_timer(workflow, sleep_duration, &blk)
11+
while sleep_duration > 0
12+
signal_received = false
13+
workflow.on_signal('update_timer') do |new_duration|
14+
workflow.logger.info("Received update_timer signal with new duration: #{new_duration}")
15+
sleep_duration = new_duration
16+
signal_received = true
17+
end
18+
19+
timer = workflow.start_timer(sleep_duration)
20+
workflow.logger.info("Started timer with duration: #{sleep_duration}s")
21+
22+
workflow.wait_until do
23+
timer.finished? || signal_received
24+
end
25+
26+
if timer.finished?
27+
workflow.logger.info("Timer fired")
28+
break
29+
end
30+
end
31+
32+
yield
33+
end
34+
end

0 commit comments

Comments
 (0)