service.xml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <class name="Service">
  2. <relationships>
  3. <association name="parent" class="MvKController" min="1" max="1"/>
  4. </relationships>
  5. <constructor>
  6. <parameter name="taskname"/>
  7. <parameter name="mvs_operations"/>
  8. <parameter name="mvk"/>
  9. <body>
  10. <![CDATA[
  11. self.taskname = taskname
  12. self.mvs_operations = mvs_operations
  13. self.mvk = mvk
  14. self.failed = False
  15. self.output_queue = []
  16. self.outputs = []
  17. self.do_yield = False
  18. print("Created new service: " + taskname)
  19. ]]>
  20. </body>
  21. </constructor>
  22. <method name="execute_modelverse">
  23. <parameter name="taskname"/>
  24. <parameter name="operation"/>
  25. <parameter name="params"/>
  26. <body>
  27. <![CDATA[
  28. reply = None
  29. commands = []
  30. mvk = self.mvk
  31. mvs_operations = self.mvs_operations
  32. try:
  33. while 1:
  34. commands = mvk.execute_yields(taskname, operation, params, reply)
  35. if commands is None:
  36. break
  37. reply = [mvs_operations[command[0]](*(command[1])) for command in commands]
  38. except:
  39. import traceback
  40. print(traceback.format_exc())
  41. #TODO delete self, as the task has crashed!
  42. return False
  43. return True
  44. ]]>
  45. </body>
  46. </method>
  47. <scxml initial="start">
  48. <parallel id="start">
  49. <state id="execution" initial="running">
  50. <state id="running" initial="executing">
  51. <state id="executing">
  52. <onentry>
  53. <script>
  54. print("Check output")
  55. self.do_yield = True
  56. while self.output_queue:
  57. if self.execute_modelverse(self.taskname, "get_output", []):
  58. if self.mvk.success:
  59. self.outputs.append((self.output_queue.pop(0), self.mvk.returnvalue))
  60. else:
  61. # No output left in Mv, so break
  62. break
  63. else:
  64. self.failed = True
  65. break
  66. </script>
  67. </onentry>
  68. <transition cond="self.failed" target="../../failed"/>
  69. <transition cond="self.do_yield" target="../yielded"/>
  70. </state>
  71. <state id="yielded">
  72. <transition after="self.sccd_yield() + 0.1" target="../executing"/>
  73. <transition event="processed_input" target="../executing"/>
  74. <transition event="waiting_output" target="../executing"/>
  75. </state>
  76. </state>
  77. <state id="failed">
  78. <state id="failed">
  79. <!-- TODO delete task -->
  80. </state>
  81. </state>
  82. </state>
  83. <state id="process_events">
  84. <state id="process_events">
  85. <transition event="input" target=".">
  86. <parameter name="params"/>
  87. <script>
  88. print("Process input")
  89. for args_entry in params:
  90. if not self.execute_modelverse(self.taskname, "set_input", [args_entry]):
  91. # Failed!
  92. self.failed = True
  93. break
  94. </script>
  95. <raise event="processed_input"/>
  96. </transition>
  97. <transition event="output" target=".">
  98. <parameter name="params"/>
  99. <script>
  100. self.output_queue.append(params)
  101. </script>
  102. <raise event="waiting_output"/>
  103. </transition>
  104. <transition cond="self.outputs" target=".">
  105. <script>
  106. source, value = self.outputs.pop(0)
  107. </script>
  108. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/%s' % source">
  109. <parameter expr="json.dumps(value)"/>
  110. </raise>
  111. </transition>
  112. </state>
  113. </state>
  114. </parallel>
  115. </scxml>
  116. </class>