Skip to content

Commit eb1024b

Browse files
committed
Add UpdatableTimer example
1 parent 5d12aa3 commit eb1024b

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

examples/bin/worker

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ worker.register_workflow(SlowChildWorkflow)
7171
worker.register_workflow(StartChildWorkflowWorkflow)
7272
worker.register_workflow(TimeoutWorkflow)
7373
worker.register_workflow(TripBookingWorkflow)
74+
worker.register_workflow(UpdatableTimer)
7475
worker.register_workflow(UpsertSearchAttributesWorkflow)
7576
worker.register_workflow(WaitForWorkflow)
7677
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: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
workflow.now - started_at
7+
end
8+
end
9+
10+
def execute_in_timer(workflow, sleep_duration, &blk)
11+
signal_received = false
12+
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+
while sleep_duration > 0
20+
signal_received = false
21+
22+
timer = workflow.start_timer(sleep_duration)
23+
workflow.logger.info("Started timer with duration: #{sleep_duration}s")
24+
25+
workflow.wait_until do
26+
timer.finished? || signal_received
27+
end
28+
29+
if timer.finished?
30+
workflow.logger.info("Timer fired")
31+
break
32+
end
33+
34+
timer.cancel
35+
end
36+
37+
yield
38+
end
39+
end

0 commit comments

Comments
 (0)