Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could add

else
    timer.cancel
end


timer.cancel
end

yield
end
end