Class | OpenWFE::WaitingExpression |
In: |
lib/openwfe/expressions/time.rb
|
Parent: | TimeExpression |
A parent class for WhenExpression and WaitExpression.
All the code for managing waiting for something to occur is concentrated here.
DEFAULT_FREQUENCY | = | "10s" | By default, classes extending this class do poll for their condition every 10 seconds. | |
MIN_FREQUENCY | = | 0.300 | Don‘t go under 300 milliseconds. |
frequency | [RW] |
Classes extending this WaitingExpression have a ‘conditions’ class method (like ‘attr_accessor’).
# File lib/openwfe/expressions/time.rb, line 150 150: def self.conditions (*attnames) 151: 152: attnames = attnames.collect do |n| 153: n.to_s.intern 154: end 155: meta_def :condition_attributes do 156: attnames 157: end 158: end
# File lib/openwfe/expressions/time.rb, line 160 160: def apply (workitem) 161: 162: remove_timedout_flag workitem 163: 164: @applied_workitem = workitem.dup 165: 166: @frequency = lookup_attribute( 167: :frequency, workitem, :default => DEFAULT_FREQUENCY) 168: @frequency = Rufus::parse_time_string( 169: @frequency) 170: @frequency = MIN_FREQUENCY \ 171: if @frequency < MIN_FREQUENCY 172: 173: determine_timeout 174: determine_scheduler_tags 175: 176: store_itself 177: 178: trigger 179: end
Cancels this expression (takes care of unscheduling a timeout if there is one).
# File lib/openwfe/expressions/time.rb, line 196 196: def cancel 197: 198: unschedule_timeout 199: super() 200: end
# File lib/openwfe/expressions/time.rb, line 181 181: def reply (workitem) 182: 183: result = workitem.get_result 184: 185: if result 186: apply_consequence(workitem) 187: else 188: reschedule(get_scheduler) 189: end 190: end
# File lib/openwfe/expressions/time.rb, line 236 236: def reply_to_parent (workitem) 237: 238: unschedule 239: unschedule_timeout 240: 241: super workitem 242: end
# File lib/openwfe/expressions/time.rb, line 220 220: def reschedule (scheduler) 221: 222: @scheduler_job_id = "waiting_#{fei.to_s}" 223: 224: scheduler.schedule_in( 225: @frequency, 226: { 227: :schedulable => self, 228: :job_id => @scheduler_job_id, 229: :tags => @scheduler_tags }) 230: 231: ldebug { "reschedule() @scheduler_job_id is #{@scheduler_job_id}" } 232: 233: to_reschedule(scheduler) 234: end
# File lib/openwfe/expressions/time.rb, line 202 202: def trigger (params={}) 203: 204: ldebug { "trigger() #{@fei.to_debug_s} params : #{params.inspect}" } 205: 206: if params[:do_timeout!] 207: # 208: # do timeout... 209: # 210: set_timedout_flag @applied_workitem 211: reply_to_parent @applied_workitem 212: return 213: end 214: 215: @scheduler_job_id = nil 216: 217: evaluate_condition() 218: end
This method is overriden by WhenExpression. WaitExpression doesn‘t override it. This default implementation simply directly replies to the parent expression.
# File lib/openwfe/expressions/time.rb, line 301 301: def apply_consequence (workitem) 302: 303: reply_to_parent workitem 304: end
Used when replying to self after an attribute condition got evaluated
# File lib/openwfe/expressions/time.rb, line 289 289: def do_reply (result) 290: 291: @applied_workitem.set_result result 292: reply @applied_workitem 293: end
The code for the condition evalution is here.
This method is overriden by the WhenExpression.
# File lib/openwfe/expressions/time.rb, line 251 251: def evaluate_condition 252: 253: condition_attribute = determine_condition_attribute( 254: self.class.condition_attributes) 255: 256: if condition_attribute 257: 258: c = eval_condition(condition_attribute, @applied_workitem) 259: 260: do_reply c 261: return 262: end 263: 264: # else, condition is nested as a child 265: 266: if @children.size < 1 267: # 268: # no condition attribute and no child attribute, 269: # simply reply to parent 270: # 271: reply_to_parent @applied_workitem 272: return 273: end 274: 275: # trigger the first child (the condition child) 276: 277: get_expression_pool.launch_template( 278: self, 279: @environment_id, 280: @condition_sub_id, 281: @children[0], 282: @applied_workitem) 283: end