/** Ċ Ġ* Ġ" Common s ĠClause " ĠLicense ĠCondition Ġv 1 . 0 Ċ Ġ* Ċ Ġ* ĠThe ĠSoftware Ġis Ġprovided Ġto Ġyou Ġby Ġthe ĠLic ensor Ġunder Ġthe ĠLicense , Ġas Ġdefined Ċ Ġ* Ġbelow , Ġsubject Ġto Ġthe Ġfollowing Ġcondition . Ċ Ġ* Ċ Ġ* ĠWithout Ġlimiting Ġother Ġconditions Ġin Ġthe ĠLicense , Ġthe Ġgrant Ġof Ġrights Ġunder Ġthe Ċ Ġ* ĠLicense Ġwill Ġnot Ġinclude , Ġand Ġthe ĠLicense Ġdoes Ġnot Ġgrant Ġto Ġyou , Ġthe Ġright Ġto Ċ Ġ* ĠS ell Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠFor Ġpurposes Ġof Ġthe Ġfore going , ĠâĢľ Sell âĢĿ Ġmeans Ġpract icing Ġany Ġor Ġall Ġof Ġthe Ġrights Ċ Ġ* Ġgranted Ġto Ġyou Ġunder Ġthe ĠLicense Ġto Ġprovide Ġto Ġthird Ġparties , Ġfor Ġa Ġfee Ġor Ċ Ġ* Ġother Ġconsideration Ġ( including Ġwithout Ġlimitation Ġfees Ġfor Ġhosting Ġor Ċ Ġ* Ġconsult ing / Ġsupport Ġservices Ġrelated Ġto Ġthe ĠSoftware ), Ġa Ġproduct Ġor Ġservice Ċ Ġ* Ġwhose Ġvalue Ġder ives , Ġentirely Ġor Ġsubstant ially , Ġfrom Ġthe Ġfunctionality Ġof Ġthe Ċ Ġ* ĠSoftware . ĠAny Ġlicense Ġnotice Ġor Ġat tribution Ġrequired Ġby Ġthe ĠLicense Ġmust Ġalso Ċ Ġ* Ġinclude Ġthis ĠCommons ĠClause ĠLicense ĠCondition Ġnotice . Ċ Ġ* Ċ Ġ* ĠSoftware : ĠInf init ic Ċ Ġ* Ċ Ġ* ĠLicense : ĠMIT ĠLicense Ġ( https :// opensource . org / licenses / MIT ) Ċ Ġ* Ċ Ġ* ĠLic ensor : Ġinf init ic . io Ċ Ġ*/ Ċ Ċ package Ġio . inf init ic . workflows . engine Ċ Ċ import Ġio . inf init ic . common . clients . messages . Method Run Unknown Ċ import Ġio . inf init ic . common . clients . transport . Send To Client Ċ import Ġio . inf init ic . common . data . Client Name Ċ import Ġio . inf init ic . common . data . ReturnValue Ċ import Ġio . inf init ic . common . errors . Unknown Workflow Error Ċ import Ġio . inf init ic . common . exceptions . this Should Not H appen Ċ import Ġio . inf init ic . common . tasks . engine . Send To Task Engine Ċ import Ġio . inf init ic . common . tasks . tags . Send To Task Tag Engine Ċ import Ġio . inf init ic . common . workflows . data . commands . Command Id Ċ import Ġio . inf init ic . common . workflows . data . commands . Command Status Ċ import Ġio . inf init ic . common . workflows . engine . Send To Workflow Engine Ċ import Ġio . inf init ic . common . workflows . engine . Send To Workflow Engine After Ċ import Ġio . inf init ic . common . workflows . engine . messages . Cancel Workflow Ċ import Ġio . inf init ic . common . workflows . engine . messages . Child Method Canceled Ċ import Ġio . inf init ic . common . workflows . engine . messages . Child Method Completed Ċ import Ġio . inf init ic . common . workflows . engine . messages . Child Method Failed Ċ import Ġio . inf init ic . common . workflows . engine . messages . Child Method Unknown Ċ import Ġio . inf init ic . common . workflows . engine . messages . Complete Workflow Ċ import Ġio . inf init ic . common . workflows . engine . messages . Dispatch Method Ċ import Ġio . inf init ic . common . workflows . engine . messages . Dispatch Workflow Ċ import Ġio . inf init ic . common . workflows . engine . messages . Retry Workflow Task Ċ import Ġio . inf init ic . common . workflows . engine . messages . Send Signal Ċ import Ġio . inf init ic . common . workflows . engine . messages . Task Canceled Ċ import Ġio . inf init ic . common . workflows . engine . messages . Task Completed Ċ import Ġio . inf init ic . common . workflows . engine . messages . Task Failed Ċ import Ġio . inf init ic . common . workflows . engine . messages . Task Unknown Ċ import Ġio . inf init ic . common . workflows . engine . messages . Timer Completed Ċ import Ġio . inf init ic . common . workflows . engine . messages . Wait Workflow Ċ import Ġio . inf init ic . common . workflows . engine . messages . Workflow Engine Message Ċ import Ġio . inf init ic . common . workflows . engine . messages . interfaces . Method Run Message Ċ import Ġio . inf init ic . common . workflows . engine . state . Workflow State Ċ import Ġio . inf init ic . common . workflows . tags . Send To Workflow Tag Engine Ċ import Ġio . inf init ic . workflows . engine . handlers . cancel Workflow Ċ import Ġio . inf init ic . workflows . engine . handlers . dispatch Method Run Ċ import Ġio . inf init ic . workflows . engine . handlers . dispatch Workflow Ċ import Ġio . inf init ic . workflows . engine . handlers . retry Workflow Task Ċ import Ġio . inf init ic . workflows . engine . handlers . send Signal Ċ import Ġio . inf init ic . workflows . engine . handlers . wait Workflow Ċ import Ġio . inf init ic . workflows . engine . handlers . workflow Task Completed Ċ import Ġio . inf init ic . workflows . engine . handlers . workflow Task Failed Ċ import Ġio . inf init ic . workflows . engine . helpers . command Terminated Ċ import Ġio . inf init ic . workflows . engine . helpers . remove Tags Ċ import Ġio . inf init ic . workflows . engine . output . Workflow Engine Output Ċ import Ġio . inf init ic . workflows . engine . storage . Logged Workflow State Storage Ċ import Ġio . inf init ic . workflows . engine . storage . Workflow State Storage Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . time . Instant Ċ Ċ class ĠWorkflow Engine ( ĊĠĠĠ Ġval Ġclient Name : ĠClient Name , ĊĠĠĠ Ġstorage : ĠWorkflow State Storage , ĊĠĠĠ Ġsend Events To Client : ĠSend To Client , ĊĠĠĠ Ġsend To Task Tag Engine : ĠSend To Task Tag Engine , ĊĠĠĠ Ġsend To Task Engine : ĠSend To Task Engine , ĊĠĠĠ Ġsend To Workflow Tag Engine : ĠSend To Workflow Tag Engine , ĊĠĠĠ Ġsend To Workflow Engine : ĠSend To Workflow Engine , ĊĠĠĠ Ġsend To Workflow Engine After : ĠSend To Workflow Engine After Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO _ STATE _ DISCARD ING _ REASON Ġ= Ġ" for Ġhaving Ġnull Ġworkflow Ġstate " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscope : ĠCor outine Scope ĊĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠLog ged Workflow State Storage ( storage ) ĊĊĠĠĠ Ġprivate Ġval Ġoutput Ġ= ĠWorkflow Engine Output ( ĊĠĠĠĠĠĠĠ Ġclient Name , ĊĠĠĠĠĠĠĠ Ġsend Events To Client , ĊĠĠĠĠĠĠĠ Ġsend To Task Tag Engine , ĊĠĠĠĠĠĠĠ Ġsend To Task Engine , ĊĠĠĠĠĠĠĠ Ġsend To Workflow Tag Engine , ĊĠĠĠĠĠĠĠ Ġsend To Workflow Engine , ĊĠĠĠĠĠĠĠ Ġsend To Workflow Engine After ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġsuspend Ġfun Ġhandle ( message : ĠWorkflow Engine Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġprocess ( message ) Ġ?: Ġreturn Ġ// Ġnull Ġ=> Ġdiscarded Ġmessage ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( state . method Runs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġstorage . del State ( message . workflow Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstorage . put State ( message . workflow Id , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġprocess ( message : ĠWorkflow Engine Message ): ĠWorkflow State ? Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġscope Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" re ceiving Ġ$ message " Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġcurrent Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstorage . getState ( message . workflow Id ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġno Ġstate Ġ( new Ġor Ġterminated Ġworkflow ) ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDispatch Workflow Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġdispatch Workflow ( output , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDispatch Method Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . client Waiting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Run Unknown Ġ= ĠMethod Run Unknown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Name Ġ= Ġmessage . emitter Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . workflow Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Name Ġ= Ġclient Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġoutput . send Events To Client ( method Run Unknown ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . parent Workflow Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Method Failed Ġ= ĠChild Method Unknown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Id Ġ= Ġmessage . parent Workflow Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Name Ġ= Ġmessage . parent Workflow Name Ġ?: Ġthis Should Not H appen (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Run Id Ġ= Ġmessage . parent Method Run Id Ġ?: Ġthis Should Not H appen (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Unknown Workflow Error Ġ= ĠUnknown Workflow Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Name Ġ= Ġmessage . workflow Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Id Ġ= Ġmessage . workflow Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Run Id Ġ= Ġmessage . method Run Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Name Ġ= Ġclient Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . parent Workflow Id Ġ!= Ġmessage . workflow Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġoutput . send To Workflow Engine ( child Method Failed ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWait Workflow Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Run Unknown Ġ= ĠMethod Run Unknown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Name Ġ= Ġmessage . emitter Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . workflow Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Name Ġ= Ġclient Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġoutput . send Events To Client ( method Run Unknown ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdiscard Ġall Ġother Ġmessages Ġif Ġworkflow Ġis Ġalready Ġterminated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Discard ing Message ( message , ĠNO _ STATE _ DISCARD ING _ REASON ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġthis Ġmessage Ġhas Ġalready Ġbeen Ġhandled ĊĠĠĠĠĠĠĠ Ġif Ġ( state . last MessageId Ġ== Ġmessage . message Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Discard ing Message ( message , Ġ" as Ġstate Ġalready Ġcontains Ġthis ĠmessageId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġis Ġthis Ġworkflow Ġhas Ġalready Ġbeen Ġlaunched ĊĠĠĠĠĠĠĠ Ġ// Ġ( a ĠDispatch Workflow Ġ( child ) Ġcan Ġbe Ġdis patched Ġtwice Ġif Ġthe Ġengine Ġis Ġshutdown Ġwhile Ġprocessing Ġa Ġworkflow Task ) ĊĠĠĠĠĠĠĠ Ġif Ġ( message Ġis ĠDispatch Workflow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Discard ing Message ( message , Ġ" as Ġworkflow Ġhas Ġalready Ġbeen Ġlaunched ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġis Ġthis Ġworkflow Task Ġis Ġthe Ġcurrent Ġone ĊĠĠĠĠĠĠĠ Ġ// Ġ( a Ġworkflow Task Ġcan Ġbe Ġdis patched Ġtwice Ġif Ġthe Ġengine Ġis Ġshutdown Ġwhile Ġprocessing Ġa Ġworkflow Task ) ĊĠĠĠĠĠĠĠ Ġif Ġ( message . is Workflow Task () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġis ĠTask Completed Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . taskId () Ġ!= Ġstate . running Workflow TaskId ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Discard ing Message ( message , Ġ" as Ġworkflow Task Ġis Ġnot Ġthe Ġcurrent Ġone ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġa Ġworkflow Ġtask Ġis Ġongoing Ġthen Ġbuffer Ġthis Ġmessage , Ġexcept Ġfor ĠWorkflow Task Completed Ġof Ġcourse ĊĠĠĠĠĠĠĠ Ġif Ġ( state . running Workflow TaskId Ġ!= Ġnull Ġ&& Ġ! Ġmessage . is Workflow Task () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbuffer Ġthis Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . messages Buffer . add ( message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġprocess Ġthis Ġmessage ĊĠĠĠĠĠĠĠ Ġprocess Message ( state , Ġmessage ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġprocess Ġall Ġbuffered Ġmessages ĊĠĠĠĠĠĠĠ Ġwhile Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . running Workflow TaskId Ġ== Ġnull Ġ&& Ġ// Ġif Ġa Ġworkflow Task Ġis Ġnot Ġongoing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . messages Buffer . size Ġ> Ġ 0 Ġ// Ġif Ġthere Ġis Ġat Ġleast Ġone Ġbuffered Ġmessage ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffered Msg Ġ= Ġstate . messages Buffer . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" workflow Id Ġ${ buffered Msg . workflow Id } Ġ- Ġprocessing Ġbuffered Ġmessage Ġ$ buffered Msg " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( state , Ġbuffered Msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġnothing Ġmore Ġto Ġdo , Ġthen Ġremove Ġreference Ġto Ġthis Ġworkflow Ġin Ġtags ĊĠĠĠĠĠĠĠ Ġif Ġ( state . method Runs . size Ġ== Ġ 0 ) Ġ{ Ġremove Tags ( output , Ġstate ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ coroutine Scope Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Discard ing Message ( message : ĠWorkflow Engine Message , Ġcause : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" workflow Id Ġ${ message . workflow Id } Ġ- Ġdiscard ing Ġ$ cause : Ġ$ message " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCor outine Scope . process Message ( state : ĠWorkflow State , Ġmessage : ĠWorkflow Engine Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġrecord Ġthis Ġmessage Ġas Ġthe Ġlast Ġprocessed ĊĠĠĠĠĠĠĠ Ġstate . last MessageId Ġ= Ġmessage . message Id ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġmessage Ġis Ġrelated Ġto Ġa Ġworkflow Task , Ġit 's Ġnot Ġrunning Ġanymore ĊĠĠĠĠĠĠĠ Ġif Ġ( message . is Workflow Task ()) Ġstate . running Workflow TaskId Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġmethod Run Ġhas Ġalready Ġbeen Ġcleaned Ġ( completed ), Ġthen Ġdiscard Ġthe Ġmessage ĊĠĠĠĠĠĠĠ Ġif Ġ( message Ġis ĠMethod Run Message Ġ&& Ġstate . getMethod Run ( message . method Run Id ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Discard ing Message ( message , Ġ" as Ġnull Ġmethod Run ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED _ VARIABLE ") ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDispatch Workflow Ġ-> Ġthis Should Not H appen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDispatch Method Ġ-> Ġdispatch Method Run ( output , Ġstate , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCancel Workflow Ġ-> Ġcancel Workflow ( output , Ġstate , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSend Signal Ġ-> Ġsend Signal ( output , Ġstate , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWait Workflow Ġ-> Ġwait Workflow ( output , Ġstate , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComplete Workflow Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRetry Workflow Task Ġ-> Ġretry Workflow Task ( output , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTimer Completed Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . timer Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Completed ( ReturnValue . from ( Instant . now ()), Ġstate . workflow Task Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChild Method Unknown Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . child Unknown Workflow Error . method Run Id Ġ?: Ġthis Should Not H appen ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Unknown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . child Unknown Workflow Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChild Method Canceled Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . child Canceled Workflow Error . method Run Id Ġ?: Ġthis Should Not H appen ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Canceled ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . child Canceled Workflow Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChild Method Failed Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . child Failed Workflow Error . method Run Id Ġ?: Ġthis Should Not H appen ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Currently Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . child Failed Workflow Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChild Method Completed Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . child Workflow ReturnValue . method Run Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Completed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . child Workflow ReturnValue . returnValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Unknown Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . unknown Task Error . taskId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Unknown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . unknown Task Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Canceled Ġ-> Ġwhen Ġ( message . is Workflow Task ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . c anceled Task Error . taskId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Canceled ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . c anceled Task Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Failed Ġ-> Ġwhen Ġ( message . is Workflow Task ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġworkflow Task Failed ( output , Ġstate , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġfake Ġmessages Ġat Ġthe Ġtop Ġof Ġthe Ġmessages Buffer Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . messages Buffer . addAll ( 0 , Ġmessages ); ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . failed Task Error . taskId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Currently Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . failed Task Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Completed Ġ-> Ġwhen Ġ( message . is Workflow Task ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġworkflow Task Completed ( output , Ġstate , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġfake Ġmessages Ġat Ġthe Ġtop Ġof Ġthe Ġmessages Buffer Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . messages Buffer . addAll ( 0 , Ġmessages ); ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġcommand Terminated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . method Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Id . from ( message . task ReturnValue . taskId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Status . Completed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . task ReturnValue . returnValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . workflow Task Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ