@@ -3,106 +3,128 @@ package worker
3
3
import (
4
4
"context"
5
5
"fmt"
6
- "sync"
7
6
8
7
"github.com/benbjohnson/clock"
9
8
"github.com/cschleiden/go-workflows/backend"
10
- "github.com/cschleiden/go-workflows/backend/history"
11
9
"github.com/cschleiden/go-workflows/client"
12
10
"github.com/cschleiden/go-workflows/internal/signals"
13
11
internal "github.com/cschleiden/go-workflows/internal/worker"
14
12
"github.com/cschleiden/go-workflows/registry"
15
13
"github.com/cschleiden/go-workflows/workflow"
16
- "github.com/cschleiden/go-workflows/workflow/executor"
17
14
)
18
15
19
16
type Worker struct {
20
17
backend backend.Backend
21
18
22
- done chan struct {}
23
- wg * sync.WaitGroup
24
-
25
19
registry * registry.Registry
26
20
27
- workflowWorker * internal.Worker [backend.WorkflowTask , executor.ExecutionResult ]
28
- activityWorker * internal.Worker [backend.ActivityTask , history.Event ]
21
+ workers []worker
22
+ }
23
+
24
+ type worker interface {
25
+ Start (context.Context ) error
26
+ WaitForCompletion () error
29
27
}
30
28
29
+ // New creates a worker that processes workflows and activities.
31
30
func New (backend backend.Backend , options * Options ) * Worker {
31
+ registry := registry .New ()
32
+
32
33
if options == nil {
33
34
options = & DefaultOptions
34
- } else {
35
- if options .WorkflowExecutorCacheSize == 0 {
36
- options .WorkflowExecutorCacheSize = DefaultOptions .WorkflowExecutorCacheSize
37
- }
38
-
39
- if options .WorkflowExecutorCacheTTL == 0 {
40
- options .WorkflowExecutorCacheTTL = DefaultOptions .WorkflowExecutorCacheTTL
41
- }
42
35
}
43
36
44
- registry := registry .New ()
37
+ workflowWorker := newWorkflowWorker (backend , registry , & options .WorkflowWorkerOptions )
38
+ activityWorker := newActivityWorker (backend , registry , & options .ActivityWorkerOptions )
45
39
46
40
// Register internal activities
41
+ return newWorker (backend , registry , []worker {workflowWorker , activityWorker })
42
+ }
43
+
44
+ // NewWorkflowWorker creates a worker that only processes workflows.
45
+ func NewWorkflowWorker (backend backend.Backend , options * WorkflowWorkerOptions ) * Worker {
46
+ registry := registry .New ()
47
+
48
+ return newWorker (backend , registry , []worker {newWorkflowWorker (backend , registry , options )})
49
+ }
50
+
51
+ // NewActivityWorker creates a worker that only processes activities.
52
+ func NewActivityWorker (backend backend.Backend , options * ActivityWorkerOptions ) * Worker {
53
+ registry := registry .New ()
54
+
55
+ return newWorker (backend , registry , []worker {newActivityWorker (backend , registry , options )})
56
+ }
57
+
58
+ func newWorker (backend backend.Backend , registry * registry.Registry , workers []worker ) * Worker {
47
59
if err := registry .RegisterActivity (& signals.Activities {Signaler : client .New (backend )}); err != nil {
48
60
panic (fmt .Errorf ("registering internal activities: %w" , err ))
49
61
}
50
62
51
63
return & Worker {
52
64
backend : backend ,
53
65
54
- done : make (chan struct {}),
55
- wg : & sync.WaitGroup {},
56
-
57
- workflowWorker : internal .NewWorkflowWorker (backend , registry , internal.WorkflowWorkerOptions {
58
- WorkerOptions : internal.WorkerOptions {
59
- Pollers : options .WorkflowPollers ,
60
- PollingInterval : options .WorkflowPollingInterval ,
61
- MaxParallelTasks : options .MaxParallelWorkflowTasks ,
62
- HeartbeatInterval : options .WorkflowHeartbeatInterval ,
63
- Queues : options .WorkflowQueues ,
64
- },
65
- WorkflowExecutorCache : options .WorkflowExecutorCache ,
66
- WorkflowExecutorCacheSize : options .WorkflowExecutorCacheSize ,
67
- WorkflowExecutorCacheTTL : options .WorkflowExecutorCacheTTL ,
68
- }),
69
-
70
- activityWorker : internal .NewActivityWorker (backend , registry , clock .New (), internal.WorkerOptions {
71
- Pollers : options .ActivityPollers ,
72
- PollingInterval : options .ActivityPollingInterval ,
73
- MaxParallelTasks : options .MaxParallelActivityTasks ,
74
- HeartbeatInterval : options .ActivityHeartbeatInterval ,
75
- Queues : options .ActivityQueues ,
76
- }),
77
-
66
+ workers : workers ,
78
67
registry : registry ,
79
68
}
80
69
}
81
70
71
+ func newActivityWorker (backend backend.Backend , registry * registry.Registry , options * ActivityWorkerOptions ) worker {
72
+ if options == nil {
73
+ options = & DefaultOptions .ActivityWorkerOptions
74
+ }
75
+
76
+ activityWorker := internal .NewActivityWorker (backend , registry , clock .New (), internal.WorkerOptions {
77
+ Pollers : options .ActivityPollers ,
78
+ PollingInterval : options .ActivityPollingInterval ,
79
+ MaxParallelTasks : options .MaxParallelActivityTasks ,
80
+ HeartbeatInterval : options .ActivityHeartbeatInterval ,
81
+ Queues : options .ActivityQueues ,
82
+ })
83
+
84
+ return activityWorker
85
+ }
86
+
87
+ func newWorkflowWorker (backend backend.Backend , registry * registry.Registry , options * WorkflowWorkerOptions ) worker {
88
+ if options == nil {
89
+ options = & DefaultOptions .WorkflowWorkerOptions
90
+ }
91
+
92
+ workflowWorker := internal .NewWorkflowWorker (backend , registry , internal.WorkflowWorkerOptions {
93
+ WorkerOptions : internal.WorkerOptions {
94
+ Pollers : options .WorkflowPollers ,
95
+ PollingInterval : options .WorkflowPollingInterval ,
96
+ MaxParallelTasks : options .MaxParallelWorkflowTasks ,
97
+ HeartbeatInterval : options .WorkflowHeartbeatInterval ,
98
+ Queues : options .WorkflowQueues ,
99
+ },
100
+ WorkflowExecutorCache : options .WorkflowExecutorCache ,
101
+ WorkflowExecutorCacheSize : options .WorkflowExecutorCacheSize ,
102
+ WorkflowExecutorCacheTTL : options .WorkflowExecutorCacheTTL ,
103
+ })
104
+
105
+ return workflowWorker
106
+ }
107
+
82
108
// Start starts the worker.
83
109
//
84
110
// To stop the worker, cancel the context passed to Start. To wait for completion of the active
85
111
// tasks, call `WaitForCompletion`.
86
112
func (w * Worker ) Start (ctx context.Context ) error {
87
- if err := w .workflowWorker .Start (ctx ); err != nil {
88
- return fmt .Errorf ("starting workflow worker: %w" , err )
89
- }
90
-
91
- if err := w .activityWorker .Start (ctx ); err != nil {
92
- return fmt .Errorf ("starting activity worker: %w" , err )
113
+ for _ , worker := range w .workers {
114
+ if err := worker .Start (ctx ); err != nil {
115
+ return fmt .Errorf ("starting worker: %w" , err )
116
+ }
93
117
}
94
118
95
119
return nil
96
120
}
97
121
98
122
// WaitForCompletion waits for all active tasks to complete.
99
123
func (w * Worker ) WaitForCompletion () error {
100
- if err := w .workflowWorker .WaitForCompletion (); err != nil {
101
- return err
102
- }
103
-
104
- if err := w .activityWorker .WaitForCompletion (); err != nil {
105
- return err
124
+ for _ , worker := range w .workers {
125
+ if err := worker .WaitForCompletion (); err != nil {
126
+ return fmt .Errorf ("waiting for worker completion: %w" , err )
127
+ }
106
128
}
107
129
108
130
return nil
0 commit comments