openwferu 0.9.15 → 0.9.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +4 -2
- data/lib/openwfe/engine/engine.rb +143 -25
- data/lib/openwfe/engine/file_persisted_engine.rb +3 -3
- data/lib/openwfe/expool/errorjournal.rb +48 -25
- data/lib/openwfe/expool/expressionpool.rb +77 -106
- data/lib/openwfe/expool/expstorage.rb +6 -5
- data/lib/openwfe/expool/threadedexpstorage.rb +190 -0
- data/lib/openwfe/expool/yamlexpstorage.rb +5 -150
- data/lib/openwfe/expressions/condition.rb +6 -6
- data/lib/openwfe/expressions/environment.rb +7 -2
- data/lib/openwfe/expressions/expressionmap.rb +14 -0
- data/lib/openwfe/expressions/fe_command.rb +2 -1
- data/lib/openwfe/expressions/fe_concurrence.rb +40 -18
- data/lib/openwfe/expressions/fe_cron.rb +14 -11
- data/lib/openwfe/expressions/fe_cursor.rb +2 -3
- data/lib/openwfe/expressions/fe_define.rb +34 -31
- data/lib/openwfe/expressions/fe_equals.rb +11 -21
- data/lib/openwfe/expressions/fe_filter_definition.rb +0 -2
- data/lib/openwfe/expressions/fe_fqv.rb +1 -3
- data/lib/openwfe/expressions/fe_if.rb +37 -12
- data/lib/openwfe/expressions/fe_iterator.rb +1 -1
- data/lib/openwfe/expressions/fe_listen.rb +147 -28
- data/lib/openwfe/expressions/fe_losfor.rb +13 -1
- data/lib/openwfe/expressions/fe_misc.rb +70 -11
- data/lib/openwfe/expressions/fe_participant.rb +3 -3
- data/lib/openwfe/expressions/fe_reserve.rb +1 -1
- data/lib/openwfe/expressions/fe_save.rb +11 -12
- data/lib/openwfe/expressions/fe_sequence.rb +22 -29
- data/lib/openwfe/expressions/fe_sleep.rb +11 -7
- data/lib/openwfe/expressions/fe_subprocess.rb +24 -10
- data/lib/openwfe/expressions/fe_value.rb +35 -15
- data/lib/openwfe/expressions/fe_when.rb +2 -4
- data/lib/openwfe/expressions/flowexpression.rb +73 -37
- data/lib/openwfe/expressions/merge.rb +2 -4
- data/lib/openwfe/expressions/raw.rb +40 -31
- data/lib/openwfe/expressions/raw_prog.rb +18 -9
- data/lib/openwfe/expressions/raw_xml.rb +1 -8
- data/lib/openwfe/expressions/simplerep.rb +27 -5
- data/lib/openwfe/expressions/time.rb +45 -15
- data/lib/openwfe/expressions/timeout.rb +2 -1
- data/lib/openwfe/expressions/wtemplate.rb +2 -2
- data/lib/openwfe/flowexpressionid.rb +62 -16
- data/lib/openwfe/listeners/listener.rb +28 -37
- data/lib/openwfe/listeners/listeners.rb +1 -1
- data/lib/openwfe/listeners/socketlisteners.rb +7 -15
- data/lib/openwfe/logging.rb +5 -4
- data/lib/openwfe/{rest → orest}/controlclient.rb +3 -5
- data/lib/openwfe/{rest → orest}/definitions.rb +0 -2
- data/lib/openwfe/{rest → orest}/exception.rb +0 -0
- data/lib/openwfe/{rest → orest}/oldrestservlet.rb +1 -1
- data/lib/openwfe/{rest → orest}/osocket.rb +1 -1
- data/lib/openwfe/{rest → orest}/restclient.rb +0 -2
- data/lib/openwfe/orest/workitem.rb +206 -0
- data/lib/openwfe/{rest → orest}/worklistclient.rb +15 -5
- data/lib/openwfe/{rest → orest}/xmlcodec.rb +4 -1
- data/lib/openwfe/participants/enoparticipants.rb +4 -14
- data/lib/openwfe/participants/participantmap.rb +16 -12
- data/lib/openwfe/participants/participants.rb +46 -1
- data/lib/openwfe/participants/socketparticipants.rb +1 -6
- data/lib/openwfe/service.rb +15 -6
- data/lib/openwfe/storage/yamlcustom.rb +3 -0
- data/lib/openwfe/storage/yamlfilestorage.rb +3 -1
- data/lib/openwfe/util/dollar.rb +21 -14
- data/lib/openwfe/util/lru.rb +29 -10
- data/lib/openwfe/util/observable.rb +4 -1
- data/lib/openwfe/util/otime.rb +3 -0
- data/lib/openwfe/util/scheduler.rb +346 -114
- data/lib/openwfe/utils.rb +67 -13
- data/lib/openwfe/version.rb +1 -1
- data/lib/openwfe/workitem.rb +22 -165
- data/lib/openwfe/worklist/oldrest.rb +2 -2
- data/test/bm/bm_1_xml_vs_prog.rb +56 -0
- data/test/{ft_26_load.rb → bm/ft_26_load.rb} +0 -0
- data/test/{ft_26b_load.rb → bm/ft_26b_load.rb} +0 -0
- data/test/{ft_26c_load.rb → bm/ft_26c_load.rb} +16 -4
- data/test/clone_test.rb +62 -0
- data/test/cron_test.rb +56 -1
- data/test/cronline_test.rb +17 -8
- data/test/description_test.rb +57 -0
- data/test/dollar_test.rb +17 -6
- data/test/eno_test.rb +22 -9
- data/test/fe_lookup_att_test.rb +50 -0
- data/test/fei_test.rb +18 -9
- data/test/flowtestbase.rb +24 -2
- data/test/ft_0.rb +10 -12
- data/test/ft_0e_multibody.rb +34 -0
- data/test/ft_10_loop.rb +4 -6
- data/test/ft_11_ppd.rb +5 -20
- data/test/ft_14b_subprocess.rb +2 -2
- data/test/ft_15_iterator.rb +56 -4
- data/test/ft_15b_iterator.rb +48 -0
- data/test/ft_16_fqv.rb +18 -3
- data/test/ft_23c_wait.rb +7 -5
- data/test/ft_25_cancel.rb +5 -3
- data/test/ft_27_getflowpos.rb +14 -11
- data/test/ft_28_fileparticipant.rb +3 -4
- data/test/ft_2_concurrence.rb +8 -12
- data/test/ft_2b_concurrence.rb +3 -2
- data/test/ft_30_socketlistener.rb +5 -6
- data/test/ft_32c_journal.rb +2 -2
- data/test/ft_32d_journal.rb +5 -6
- data/test/ft_33_description.rb +8 -3
- data/test/ft_34_cancelwfid.rb +3 -3
- data/test/ft_38_tag.rb +7 -10
- data/test/ft_39_reserve.rb +4 -2
- data/test/ft_3_equals.rb +18 -13
- data/test/ft_44b_restore.rb +2 -6
- data/test/ft_49_condition.rb +16 -12
- data/test/ft_4_misc.rb +51 -12
- data/test/ft_50_xml_attribute.rb +1 -1
- data/test/ft_54_listen.rb +96 -10
- data/test/ft_54b_listen.rb +68 -0
- data/test/ft_55_ptimeout.rb +1 -2
- data/test/ft_58_ejournal.rb +8 -33
- data/test/ft_59_ps.rb +2 -3
- data/test/ft_59b_ps_for_pat.rb +59 -0
- data/test/ft_5_time.rb +45 -4
- data/test/ft_60_ecancel.rb +7 -7
- data/test/ft_61_elsub.rb +1 -1
- data/test/ft_64_alias.rb +1 -1
- data/test/ft_67_schedlaunch.rb +29 -16
- data/test/ft_69_cancelmissing.rb +1 -1
- data/test/ft_6_lambda.rb +8 -6
- data/test/ft_70_lookupvar.rb +2 -2
- data/test/ft_71_log.rb +60 -0
- data/test/ft_72_lookup_processes.rb +79 -0
- data/test/ft_73_cancel_sub.rb +144 -0
- data/test/ft_74_block_and_workitem_dup.rb +63 -0
- data/test/ft_75_ruby_attributes.rb +87 -0
- data/test/ft_76_merge_isolate.rb +90 -0
- data/test/ft_7_lose.rb +2 -1
- data/test/ft_tests.rb +9 -0
- data/test/lookup_att_test.rb +90 -0
- data/test/misc_test.rb +33 -50
- data/test/orest_test.rb +1 -1
- data/test/participant_test.rb +32 -8
- data/test/pending.rb +6 -7
- data/test/rake_ltest.rb +3 -0
- data/test/rake_qtest.rb +4 -1
- data/test/raw_prog_test.rb +1 -1
- data/test/restart_cron_test.rb +6 -6
- data/test/restart_sleep_test.rb +8 -8
- data/test/ruby_procdef_test.rb +2 -2
- data/test/rutest_utils.rb +9 -3
- data/test/scheduler_1_test.rb +88 -0
- data/test/scheduler_test.rb +49 -4
- data/test/sec_test.rb +18 -11
- metadata +51 -34
- data/test/cron_test_2.rb +0 -50
data/README.txt
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
= OpenWFEru, Standard Library Documentation
|
|
2
2
|
|
|
3
3
|
== Prerequisites
|
|
4
|
-
|
|
5
|
-
RubyGems 0.9.4 or later
|
|
4
|
+
|
|
5
|
+
Ruby 1.8.5 or later, RubyGems 0.9.4 or later
|
|
6
6
|
|
|
7
7
|
== Installation
|
|
8
|
+
|
|
8
9
|
Installation can be handled by Ruby gems. This will pull in any libraries
|
|
9
10
|
you will need to install
|
|
10
11
|
|
|
11
12
|
gem install -y openwferu
|
|
12
13
|
|
|
13
14
|
== Overview
|
|
15
|
+
|
|
14
16
|
OpenWFEru is a Ruby port of the OpenWFE workflow engine
|
|
15
17
|
(http://www.openwfe.org). It is a complete rewrite in Ruby
|
|
16
18
|
so does not need to use the Java-based engine from OpenWFE.
|
|
@@ -86,7 +86,7 @@ module OpenWFE
|
|
|
86
86
|
unless $OWFE_LOG
|
|
87
87
|
#puts "Creating logs in " + FileUtils.pwd
|
|
88
88
|
FileUtils.mkdir("logs") unless File.exist?("logs")
|
|
89
|
-
$OWFE_LOG = Logger.new
|
|
89
|
+
$OWFE_LOG = Logger.new "logs/openwferu.log", 10, 1024000
|
|
90
90
|
$OWFE_LOG.level = Logger::INFO
|
|
91
91
|
end
|
|
92
92
|
|
|
@@ -95,37 +95,37 @@ module OpenWFE
|
|
|
95
95
|
# especially for the expstorage which 'observes' the expression
|
|
96
96
|
# pool and thus needs to be instantiated after it.
|
|
97
97
|
|
|
98
|
-
build_scheduler
|
|
98
|
+
build_scheduler
|
|
99
99
|
#
|
|
100
100
|
# for delayed or repetitive executions (it's the engine's clock)
|
|
101
101
|
# see http://openwferu.rubyforge.org/scheduler.html
|
|
102
102
|
|
|
103
|
-
build_expression_map
|
|
103
|
+
build_expression_map
|
|
104
104
|
#
|
|
105
105
|
# mapping expression names ('sequence', 'if', 'concurrence',
|
|
106
106
|
# 'when'...) to their implementations (SequenceExpression,
|
|
107
107
|
# IfExpression, ConcurrenceExpression, ...)
|
|
108
108
|
|
|
109
|
-
build_wfid_generator
|
|
109
|
+
build_wfid_generator
|
|
110
110
|
#
|
|
111
111
|
# the workflow instance (process instance) id generator
|
|
112
112
|
# making sure each process instance has a unique identifier
|
|
113
113
|
|
|
114
|
-
build_expression_pool
|
|
114
|
+
build_expression_pool
|
|
115
115
|
#
|
|
116
116
|
# the core (hairy ball) of the engine
|
|
117
117
|
|
|
118
|
-
build_expression_storage
|
|
118
|
+
build_expression_storage
|
|
119
119
|
#
|
|
120
120
|
# the engine persistence (persisting the expression instances
|
|
121
121
|
# that make up process instances)
|
|
122
122
|
|
|
123
|
-
build_participant_map
|
|
123
|
+
build_participant_map
|
|
124
124
|
#
|
|
125
125
|
# building the services that maps participant names to
|
|
126
126
|
# participant implementations / instances.
|
|
127
127
|
|
|
128
|
-
build_error_journal
|
|
128
|
+
build_error_journal
|
|
129
129
|
#
|
|
130
130
|
# builds the error journal (keeping track of failures
|
|
131
131
|
# in business process executions, and an opportunity to
|
|
@@ -212,22 +212,50 @@ module OpenWFE
|
|
|
212
212
|
#
|
|
213
213
|
# This method also accepts LaunchItem instances.
|
|
214
214
|
#
|
|
215
|
+
# Since OpenWFEru 0.9.16, this reply method accepts InFlowWorkitem
|
|
216
|
+
# that don't belong to a process instance (ie whose flow_expression_id
|
|
217
|
+
# is nil). It will simply notify the participant_map of the reply
|
|
218
|
+
# for the given participant_name. If there is no participant_name
|
|
219
|
+
# specified for this orphan workitem, an exception will be raised.
|
|
220
|
+
#
|
|
215
221
|
def reply (workitem)
|
|
216
222
|
|
|
217
|
-
if workitem.
|
|
223
|
+
if workitem.is_a?(InFlowWorkItem)
|
|
218
224
|
|
|
219
|
-
|
|
225
|
+
if workitem.flow_expression_id
|
|
226
|
+
#
|
|
227
|
+
# vanilla case, workitem coming back
|
|
228
|
+
# (from listener probably)
|
|
220
229
|
|
|
221
|
-
|
|
230
|
+
return get_expression_pool.reply(
|
|
231
|
+
workitem.flow_expression_id, workitem)
|
|
232
|
+
end
|
|
222
233
|
|
|
223
|
-
|
|
234
|
+
if workitem.participant_name
|
|
235
|
+
#
|
|
236
|
+
# a workitem that doesn't belong to a process instance
|
|
237
|
+
# but bears a participant name.
|
|
238
|
+
# Notify, there may be something listening on
|
|
239
|
+
# this channel (see the 'listen' expression).
|
|
224
240
|
|
|
225
|
-
|
|
241
|
+
return get_participant_map.onotify(
|
|
242
|
+
workitem.participant_name, :reply, workitem)
|
|
243
|
+
end
|
|
226
244
|
|
|
227
245
|
raise \
|
|
228
|
-
"
|
|
229
|
-
"
|
|
246
|
+
"InFlowWorkitem doesn't belong to a process instance" +
|
|
247
|
+
" nor to a participant"
|
|
230
248
|
end
|
|
249
|
+
|
|
250
|
+
return get_expression_pool.launch(workitem) \
|
|
251
|
+
if workitem.is_a?(LaunchItem)
|
|
252
|
+
#
|
|
253
|
+
# launchitem coming from listener
|
|
254
|
+
# let's attempt to launch a new process instance
|
|
255
|
+
|
|
256
|
+
raise \
|
|
257
|
+
"engine.reply() " +
|
|
258
|
+
"cannot handle instances of #{workitem.class}"
|
|
231
259
|
end
|
|
232
260
|
|
|
233
261
|
alias :forward :reply
|
|
@@ -254,7 +282,7 @@ module OpenWFE
|
|
|
254
282
|
#
|
|
255
283
|
def get_participant (participant_name)
|
|
256
284
|
|
|
257
|
-
get_participant_map.lookup_participant
|
|
285
|
+
get_participant_map.lookup_participant participant_name
|
|
258
286
|
end
|
|
259
287
|
|
|
260
288
|
#
|
|
@@ -263,7 +291,7 @@ module OpenWFE
|
|
|
263
291
|
#
|
|
264
292
|
def unregister_participant (participant_name)
|
|
265
293
|
|
|
266
|
-
get_participant_map.unregister_participant
|
|
294
|
+
get_participant_map.unregister_participant participant_name
|
|
267
295
|
end
|
|
268
296
|
|
|
269
297
|
#
|
|
@@ -568,7 +596,11 @@ module OpenWFE
|
|
|
568
596
|
#
|
|
569
597
|
def pause_process (wfid)
|
|
570
598
|
|
|
571
|
-
|
|
599
|
+
wfid = extract_wfid(wfid)
|
|
600
|
+
|
|
601
|
+
root_expression = get_expression_pool.fetch_root(wfid)
|
|
602
|
+
|
|
603
|
+
root_expression.set_variable(VAR_PAUSED, true)
|
|
572
604
|
end
|
|
573
605
|
|
|
574
606
|
#
|
|
@@ -578,7 +610,47 @@ module OpenWFE
|
|
|
578
610
|
#
|
|
579
611
|
def resume_process (wfid)
|
|
580
612
|
|
|
581
|
-
|
|
613
|
+
wfid = extract_wfid wfid
|
|
614
|
+
|
|
615
|
+
root_expression = get_expression_pool.fetch_root wfid
|
|
616
|
+
|
|
617
|
+
#
|
|
618
|
+
# remove 'paused' flag
|
|
619
|
+
|
|
620
|
+
root_expression.unset_variable(VAR_PAUSED)
|
|
621
|
+
|
|
622
|
+
#
|
|
623
|
+
# replay
|
|
624
|
+
#
|
|
625
|
+
# select PausedError instances in separate list
|
|
626
|
+
|
|
627
|
+
errors = get_error_journal.get_error_log wfid
|
|
628
|
+
error_class = PausedError.name
|
|
629
|
+
paused_errors = errors.select { |e| e.error_class == error_class }
|
|
630
|
+
|
|
631
|
+
return if paused_errors.size < 1
|
|
632
|
+
|
|
633
|
+
# replay select PausedError instances
|
|
634
|
+
|
|
635
|
+
paused_errors.each do |e|
|
|
636
|
+
replay_at_error e
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
#
|
|
641
|
+
# Takes care of removing an error from the error journal and
|
|
642
|
+
# they replays its process at that point.
|
|
643
|
+
#
|
|
644
|
+
def replay_at_error (error)
|
|
645
|
+
|
|
646
|
+
get_error_journal.remove_errors(
|
|
647
|
+
error.fei.parent_wfid,
|
|
648
|
+
error)
|
|
649
|
+
|
|
650
|
+
get_expression_pool.queue_work(
|
|
651
|
+
error.message,
|
|
652
|
+
error.fei,
|
|
653
|
+
error.workitem)
|
|
582
654
|
end
|
|
583
655
|
|
|
584
656
|
#
|
|
@@ -605,6 +677,46 @@ module OpenWFE
|
|
|
605
677
|
exp.lookup_variable var_name
|
|
606
678
|
end
|
|
607
679
|
|
|
680
|
+
#
|
|
681
|
+
# Returns an array of wfid (workflow instance ids) whose root
|
|
682
|
+
# environment containes the given variable
|
|
683
|
+
#
|
|
684
|
+
# If there are no matches, an empty array will be returned.
|
|
685
|
+
#
|
|
686
|
+
# Regular expressions are accepted as values.
|
|
687
|
+
#
|
|
688
|
+
# If no value is given, all processes with the given variable name
|
|
689
|
+
# set will be returned.
|
|
690
|
+
#
|
|
691
|
+
def lookup_processes (var_name, value=nil)
|
|
692
|
+
|
|
693
|
+
# TODO : maybe this would be better in the ExpressionPool
|
|
694
|
+
|
|
695
|
+
result = []
|
|
696
|
+
|
|
697
|
+
regexp = if value
|
|
698
|
+
if value.is_a?(Regexp)
|
|
699
|
+
value
|
|
700
|
+
else
|
|
701
|
+
Regexp.compile(value.to_s)
|
|
702
|
+
end
|
|
703
|
+
else
|
|
704
|
+
nil
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
get_expression_storage.each_of_kind(Environment) do |fei, env|
|
|
708
|
+
|
|
709
|
+
val = env.variables[var_name]
|
|
710
|
+
|
|
711
|
+
next unless val
|
|
712
|
+
next if regexp and (not regexp.match(val))
|
|
713
|
+
|
|
714
|
+
result.push env.fei.wfid
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
result
|
|
718
|
+
end
|
|
719
|
+
|
|
608
720
|
protected
|
|
609
721
|
|
|
610
722
|
#--
|
|
@@ -649,7 +761,7 @@ module OpenWFE
|
|
|
649
761
|
#
|
|
650
762
|
def build_expression_pool
|
|
651
763
|
|
|
652
|
-
init_service
|
|
764
|
+
init_service S_EXPRESSION_POOL, ExpressionPool
|
|
653
765
|
end
|
|
654
766
|
|
|
655
767
|
#
|
|
@@ -661,7 +773,7 @@ module OpenWFE
|
|
|
661
773
|
#
|
|
662
774
|
def build_expression_storage
|
|
663
775
|
|
|
664
|
-
init_service
|
|
776
|
+
init_service S_EXPRESSION_STORAGE, InMemoryExpressionStorage
|
|
665
777
|
end
|
|
666
778
|
|
|
667
779
|
#
|
|
@@ -671,7 +783,7 @@ module OpenWFE
|
|
|
671
783
|
#
|
|
672
784
|
def build_participant_map
|
|
673
785
|
|
|
674
|
-
init_service
|
|
786
|
+
init_service S_PARTICIPANT_MAP, ParticipantMap
|
|
675
787
|
end
|
|
676
788
|
|
|
677
789
|
#
|
|
@@ -680,7 +792,7 @@ module OpenWFE
|
|
|
680
792
|
#
|
|
681
793
|
def build_scheduler
|
|
682
794
|
|
|
683
|
-
init_service
|
|
795
|
+
init_service S_SCHEDULER, SchedulerService
|
|
684
796
|
end
|
|
685
797
|
|
|
686
798
|
#
|
|
@@ -689,7 +801,7 @@ module OpenWFE
|
|
|
689
801
|
#
|
|
690
802
|
def build_error_journal
|
|
691
803
|
|
|
692
|
-
init_service
|
|
804
|
+
init_service S_ERROR_JOURNAL, InMemoryErrorJournal
|
|
693
805
|
end
|
|
694
806
|
|
|
695
807
|
#
|
|
@@ -756,10 +868,16 @@ module OpenWFE
|
|
|
756
868
|
#
|
|
757
869
|
attr_reader :errors
|
|
758
870
|
|
|
871
|
+
#
|
|
872
|
+
# The time at which the process got launched.
|
|
873
|
+
#
|
|
874
|
+
attr_reader :launch_time
|
|
875
|
+
|
|
759
876
|
def initialize
|
|
760
877
|
@wfid = nil
|
|
761
878
|
@expressions = []
|
|
762
879
|
@errors = {}
|
|
880
|
+
@launch_time = nil
|
|
763
881
|
end
|
|
764
882
|
|
|
765
883
|
#
|
|
@@ -806,7 +924,7 @@ module OpenWFE
|
|
|
806
924
|
|
|
807
925
|
set_wfid fexp.fei.parent_wfid
|
|
808
926
|
|
|
809
|
-
|
|
927
|
+
@launch_time = fexp.apply_time if fexp.fei.expid == '0'
|
|
810
928
|
|
|
811
929
|
exps = @expressions
|
|
812
930
|
@expressions = []
|
|
@@ -62,7 +62,7 @@ module OpenWFE
|
|
|
62
62
|
#
|
|
63
63
|
def build_expression_storage ()
|
|
64
64
|
|
|
65
|
-
init_service
|
|
65
|
+
init_service S_EXPRESSION_STORAGE, YamlFileExpressionStorage
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
#
|
|
@@ -70,7 +70,7 @@ module OpenWFE
|
|
|
70
70
|
#
|
|
71
71
|
def build_error_journal ()
|
|
72
72
|
|
|
73
|
-
init_service
|
|
73
|
+
init_service S_ERROR_JOURNAL, YamlErrorJournal
|
|
74
74
|
end
|
|
75
75
|
end
|
|
76
76
|
|
|
@@ -88,7 +88,7 @@ module OpenWFE
|
|
|
88
88
|
|
|
89
89
|
def build_expression_storage ()
|
|
90
90
|
|
|
91
|
-
@application_context[:expression_cache_size]
|
|
91
|
+
@application_context[:expression_cache_size] ||= 1000
|
|
92
92
|
|
|
93
93
|
init_service(
|
|
94
94
|
S_EXPRESSION_STORAGE,
|
|
@@ -42,6 +42,7 @@ require 'fileutils'
|
|
|
42
42
|
|
|
43
43
|
require 'openwfe/service'
|
|
44
44
|
require 'openwfe/omixins'
|
|
45
|
+
require 'openwfe/rudefinitions'
|
|
45
46
|
|
|
46
47
|
|
|
47
48
|
module OpenWFE
|
|
@@ -151,9 +152,9 @@ module OpenWFE
|
|
|
151
152
|
|
|
152
153
|
super
|
|
153
154
|
|
|
154
|
-
get_expression_pool.add_observer
|
|
155
|
+
get_expression_pool.add_observer :error do |event, *args|
|
|
155
156
|
#
|
|
156
|
-
# logs each error
|
|
157
|
+
# logs each error occurring in the expression pool
|
|
157
158
|
|
|
158
159
|
begin
|
|
159
160
|
|
|
@@ -163,6 +164,16 @@ module OpenWFE
|
|
|
163
164
|
lwarn { "*** process error : \n" + args.join("\n") }
|
|
164
165
|
end
|
|
165
166
|
end
|
|
167
|
+
|
|
168
|
+
get_expression_pool.add_observer :terminate do |event, *args|
|
|
169
|
+
#
|
|
170
|
+
# removes error log when a process terminates
|
|
171
|
+
|
|
172
|
+
fei = args[0].fei
|
|
173
|
+
|
|
174
|
+
remove_error_log fei.wfid \
|
|
175
|
+
if fei.is_in_parent_process?
|
|
176
|
+
end
|
|
166
177
|
end
|
|
167
178
|
|
|
168
179
|
#
|
|
@@ -174,6 +185,9 @@ module OpenWFE
|
|
|
174
185
|
get_error_log(wfid).size > 0
|
|
175
186
|
end
|
|
176
187
|
|
|
188
|
+
#--
|
|
189
|
+
#
|
|
190
|
+
# Commented out : has no real value
|
|
177
191
|
#
|
|
178
192
|
# Replays the given process instance (wfid or fei) at its last
|
|
179
193
|
# recorded error.
|
|
@@ -185,32 +199,30 @@ module OpenWFE
|
|
|
185
199
|
#
|
|
186
200
|
# Will replay a given process instance at its 1 to last error.
|
|
187
201
|
#
|
|
188
|
-
def replay_at_last_error (wfid, offset=0)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
raise "no error for process '#{wfid}' at offset #{offset}" \
|
|
199
|
-
unless error
|
|
200
|
-
|
|
201
|
-
replay_at_error error
|
|
202
|
-
end
|
|
202
|
+
#def replay_at_last_error (wfid, offset=0)
|
|
203
|
+
# wfid = to_wfid(wfid)
|
|
204
|
+
# log = get_error_log(wfid)
|
|
205
|
+
# index = (-1 - offset)
|
|
206
|
+
# error = log[index]
|
|
207
|
+
# raise "no error for process '#{wfid}' at offset #{offset}" \
|
|
208
|
+
# unless error
|
|
209
|
+
# replay_at_error error
|
|
210
|
+
#end
|
|
211
|
+
#++
|
|
203
212
|
|
|
213
|
+
#--
|
|
214
|
+
#
|
|
215
|
+
# Moved to the engine itself.
|
|
204
216
|
#
|
|
205
217
|
# Replays at a specific error (fetched with read_error_log()).
|
|
206
218
|
#
|
|
207
|
-
def replay_at_error (error)
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
219
|
+
#def replay_at_error (error)
|
|
220
|
+
# get_expression_pool.queue_work(
|
|
221
|
+
# error.message,
|
|
222
|
+
# error.fei,
|
|
223
|
+
# error.workitem)
|
|
224
|
+
#end
|
|
225
|
+
#++
|
|
214
226
|
|
|
215
227
|
#
|
|
216
228
|
# A utility method : given a list of errors, will make sure that for
|
|
@@ -276,8 +288,12 @@ module OpenWFE
|
|
|
276
288
|
#
|
|
277
289
|
# Removes a list of errors from the error journal.
|
|
278
290
|
#
|
|
291
|
+
# The 'errors' parameter may be a single error (instead of an array).
|
|
292
|
+
#
|
|
279
293
|
def remove_errors (wfid, errors)
|
|
280
294
|
|
|
295
|
+
errors = Array(errors)
|
|
296
|
+
|
|
281
297
|
log = get_error_log wfid
|
|
282
298
|
|
|
283
299
|
errors.each do |e|
|
|
@@ -313,6 +329,9 @@ module OpenWFE
|
|
|
313
329
|
def initialize (service_name, application_context)
|
|
314
330
|
|
|
315
331
|
require 'openwfe/storage/yamlcustom'
|
|
332
|
+
# making sure this file has been required at this point
|
|
333
|
+
# this yamlcustom thing prevents the whole OpenWFE ecosystem
|
|
334
|
+
# to get serialized :)
|
|
316
335
|
|
|
317
336
|
super
|
|
318
337
|
|
|
@@ -373,7 +392,9 @@ module OpenWFE
|
|
|
373
392
|
#
|
|
374
393
|
def remove_error_log (wfid)
|
|
375
394
|
|
|
376
|
-
|
|
395
|
+
path = get_path wfid
|
|
396
|
+
|
|
397
|
+
File.delete(path) if File.exist?(path)
|
|
377
398
|
end
|
|
378
399
|
|
|
379
400
|
#
|
|
@@ -381,6 +402,8 @@ module OpenWFE
|
|
|
381
402
|
#
|
|
382
403
|
def remove_errors (wfid, errors)
|
|
383
404
|
|
|
405
|
+
errors = Array(errors)
|
|
406
|
+
|
|
384
407
|
# load all errors
|
|
385
408
|
|
|
386
409
|
log = get_error_log wfid
|