/
main.go
84 lines (74 loc) · 2.95 KB
/
main.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
package main
import (
"encoding/gob"
"flag"
"time"
"github.com/pborman/uuid"
"go.uber.org/cadence/client"
"go.uber.org/cadence/encoded"
"go.uber.org/cadence/worker"
"github.com/uber-common/cadence-samples/cmd/samples/common"
)
// This needs to be done as part of a bootstrap step when the process starts.
// The workers are supposed to be long running.
func startWorkers(h *common.SampleHelper) {
// Configure worker options.
workerOptions := worker.Options{
MetricsScope: h.WorkerMetricScope,
Logger: h.Logger,
MaxConcurrentActivityExecutionSize: 1, // Activities are supposed to be CPU intensive, so better limit the concurrency
DataConverter: h.DataConverter,
}
h.StartWorkers(h.Config.DomainName, ApplicationName, workerOptions)
}
func startWorkflow(h *common.SampleHelper, functionName string) {
workflowOptions := client.StartWorkflowOptions{
ID: "PSO_" + uuid.New(),
TaskList: ApplicationName,
ExecutionStartToCloseTimeout: time.Minute * 60,
DecisionTaskStartToCloseTimeout: time.Second * 10, // Measure of responsiveness of the worker to various server signals apart from start workflow. Small means faster recovery in the case of worker failure
}
h.StartWorkflow(workflowOptions, samplePSOWorkflow, functionName)
}
func main() {
var mode, functionName, workflowID, runID, queryType string
flag.StringVar(&mode, "m", "trigger", "Mode is worker or trigger")
flag.StringVar(&functionName, "f", "sphere", "One of [sphere, rosenbrock, griewank]")
flag.StringVar(&workflowID, "w", "", "WorkflowID")
flag.StringVar(&runID, "r", "", "RunID")
flag.StringVar(&queryType, "t", "__stack_trace", "Query type is one of [__stack_trace, child, iteration]")
flag.Parse()
// If Gob is used to serialize data, then need to register types into gob as well???
// TOVERIFY: the test works even without type registation!
const useGob = false
var dataConverter encoded.DataConverter
if useGob {
dataConverter = NewGobDataConverter()
gob.Register(Vector{})
gob.Register(Position{})
gob.Register(Particle{})
gob.Register(ObjectiveFunction{})
gob.Register(SwarmSettings{})
gob.Register(Swarm{})
} else {
dataConverter = NewJSONDataConverter()
}
var h common.SampleHelper
h.DataConverter = dataConverter
h.SetupServiceConfig() // This configures DataConverter
switch mode {
case "worker":
h.RegisterWorkflow(samplePSOWorkflow)
h.RegisterWorkflow(samplePSOChildWorkflow)
h.RegisterActivityWithAlias(initParticleActivity, initParticleActivityName)
h.RegisterActivityWithAlias(updateParticleActivity, updateParticleActivityName)
startWorkers(&h)
// The workers are supposed to be long running process that should not exit.
// Use select{} to block indefinitely for samples, you can quit by CMD+C.
select {}
case "trigger":
startWorkflow(&h, functionName)
case "query":
h.QueryWorkflow(workflowID, runID, queryType)
}
}