-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathworkflow.go
143 lines (112 loc) · 3.88 KB
/
workflow.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package microservices
import (
"github.com/indeedeng/iwf-golang-samples/workflows/service"
"github.com/indeedeng/iwf-golang-sdk/gen/iwfidl"
"github.com/indeedeng/iwf-golang-sdk/iwf"
"time"
)
func NewMicroserviceOrchestrationWorkflow(svc service.MyService) iwf.ObjectWorkflow {
return &OrchestrationWorkflow{
svc: svc,
}
}
type OrchestrationWorkflow struct {
iwf.DefaultWorkflowType
svc service.MyService
}
func (e OrchestrationWorkflow) GetWorkflowStates() []iwf.StateDef {
return []iwf.StateDef{
iwf.StartingStateDef(NewState1(e.svc)),
iwf.NonStartingStateDef(NewState2(e.svc)),
iwf.NonStartingStateDef(NewState3(e.svc)),
iwf.NonStartingStateDef(NewState4(e.svc)),
}
}
func (e OrchestrationWorkflow) GetPersistenceSchema() []iwf.PersistenceFieldDef {
return []iwf.PersistenceFieldDef{
iwf.DataAttributeDef(keyData),
}
}
func (e OrchestrationWorkflow) GetCommunicationSchema() []iwf.CommunicationMethodDef {
return []iwf.CommunicationMethodDef{
iwf.SignalChannelDef(SignalChannelReady),
iwf.RPCMethodDef(e.Swap, nil),
}
}
const (
keyData = "data"
SignalChannelReady = "Ready"
)
func (e OrchestrationWorkflow) Swap(ctx iwf.WorkflowContext, input iwf.Object, persistence iwf.Persistence, communication iwf.Communication) (interface{}, error) {
var oldData string
persistence.GetDataAttribute(keyData, &oldData)
var newData string
input.Get(&newData)
persistence.SetDataAttribute(keyData, newData)
return oldData, nil
}
func NewState1(svc service.MyService) iwf.WorkflowState {
return state1{svc: svc}
}
type state1 struct {
iwf.WorkflowStateDefaultsNoWaitUntil
svc service.MyService
}
func (i state1) Execute(ctx iwf.WorkflowContext, input iwf.Object, commandResults iwf.CommandResults, persistence iwf.Persistence, communication iwf.Communication) (*iwf.StateDecision, error) {
var inString string
input.Get(&inString)
i.svc.CallAPI1(inString)
persistence.SetDataAttribute(keyData, inString)
return iwf.MultiNextStatesWithInput(
iwf.NewStateMovement(state2{}, nil),
iwf.NewStateMovement(state3{}, nil),
), nil
}
func NewState2(svc service.MyService) iwf.WorkflowState {
return state2{svc: svc}
}
type state2 struct {
iwf.WorkflowStateDefaultsNoWaitUntil
svc service.MyService
}
func (i state2) Execute(ctx iwf.WorkflowContext, input iwf.Object, commandResults iwf.CommandResults, persistence iwf.Persistence, communication iwf.Communication) (*iwf.StateDecision, error) {
var data string
persistence.GetDataAttribute(keyData, &data)
i.svc.CallAPI2(data)
return iwf.DeadEnd, nil
}
func NewState3(svc service.MyService) iwf.WorkflowState {
return state3{svc: svc}
}
type state3 struct {
iwf.WorkflowStateDefaults
svc service.MyService
}
func (i state3) WaitUntil(ctx iwf.WorkflowContext, input iwf.Object, persistence iwf.Persistence, communication iwf.Communication) (*iwf.CommandRequest, error) {
return iwf.AnyCommandCompletedRequest(
iwf.NewTimerCommand("", time.Now().Add(time.Hour*24)),
iwf.NewSignalCommand("", SignalChannelReady),
), nil
}
func (i state3) Execute(ctx iwf.WorkflowContext, input iwf.Object, commandResults iwf.CommandResults, persistence iwf.Persistence, communication iwf.Communication) (*iwf.StateDecision, error) {
var data string
persistence.GetDataAttribute(keyData, &data)
i.svc.CallAPI3(data)
if commandResults.Timers[0].Status == iwfidl.FIRED {
return iwf.SingleNextState(state4{}, nil), nil
}
return iwf.GracefulCompletingWorkflow, nil
}
func NewState4(svc service.MyService) iwf.WorkflowState {
return state4{svc: svc}
}
type state4 struct {
iwf.WorkflowStateDefaultsNoWaitUntil
svc service.MyService
}
func (i state4) Execute(ctx iwf.WorkflowContext, input iwf.Object, commandResults iwf.CommandResults, persistence iwf.Persistence, communication iwf.Communication) (*iwf.StateDecision, error) {
var data string
persistence.GetDataAttribute(keyData, &data)
i.svc.CallAPI4(data)
return iwf.GracefulCompletingWorkflow, nil
}