| Class | OpenWFE::SleepExpression |
| In: |
lib/openwfe/expressions/fe_sleep.rb
|
| Parent: | TimeExpression |
The ‘sleep’ expression expects one attribute, either ‘for’, either ‘until’.
<sequence>
<sleep for="10m12s" />
<participant ref="alpha" />
</sequence>
will wait for 10 minutes and 12 seconds before sending a workitem to participant ‘alpha’.
In a Ruby process definition, that might look like :
sleep :for => "3m"
sleep "3m"
#
# both meaning 'sleep for 3 minutes'
sleep :until => "Mon Dec 03 10:41:58 +0900 2007"
#
# sleep until the given point in time
If the ‘until’ attribute points to a time in the past, the sleep expression will simply let the process resume.
| awakening_time | [RW] |
# File lib/openwfe/expressions/fe_sleep.rb, line 79
79: def apply (workitem)
80:
81: sfor = lookup_string_attribute(:for, workitem)
82: suntil = lookup_string_attribute(:until, workitem)
83:
84: sfor = fetch_text_content(workitem) \
85: if sfor == nil and suntil == nil
86:
87: #ldebug { "apply() sfor is '#{sfor}'" }
88: #ldebug { "apply() suntil is '#{suntil}'" }
89:
90: tuntil = nil
91:
92: if suntil
93:
94: tuntil = suntil
95:
96: elsif sfor
97:
98: tfor = Rufus::parse_time_string(sfor)
99: #ldebug { "apply() tfor is '#{tfor}'" }
100: tuntil = Time.new.to_f + tfor
101: end
102:
103: #ldebug { "apply() tuntil is '#{tuntil}'" }
104:
105: return reply_to_parent(workitem) \
106: if not tuntil
107:
108: @awakening_time = tuntil
109: @applied_workitem = workitem.dup
110:
111: determine_scheduler_tags
112:
113: reschedule(get_scheduler)
114: end
[Re]schedules this expression, effectively registering it within the scheduler. This method is called when the expression is applied and each time the owning engine restarts.
# File lib/openwfe/expressions/fe_sleep.rb, line 137
137: def reschedule (scheduler)
138:
139: return unless @awakening_time
140:
141: ldebug do
142: "[re]schedule() " +
143: "will sleep until '#{@awakening_time}' " +
144: "(#{Rufus::to_iso8601_date(@awakening_time)})"
145: end
146:
147: @scheduler_job_id = "sleep_#{self.fei.to_s}"
148:
149: scheduler.schedule_at(
150: @awakening_time,
151: {
152: :schedulable => self,
153: :job_id => @scheduler_job_id,
154: :tags => @scheduler_tags })
155:
156: ldebug do
157: "[re]schedule() @scheduler_job_id is '#{@scheduler_job_id}' "+
158: " (scheduler #{scheduler.object_id})"
159: end
160:
161: store_itself
162: end
This is the method called by the Scheduler instance attached to the workflow engine when the ‘sleep’ of this expression is over
# File lib/openwfe/expressions/fe_sleep.rb, line 121
121: def trigger (params)
122:
123: ldebug do
124: "trigger() #{@fei.to_debug_s} waking up (#{Time.new.to_f}) "+
125: "(scheduler #{get_scheduler.object_id})"
126: end
127:
128: reply_to_parent(@applied_workitem)
129: end