|
| 1 | +// Copyright (c) 2022, R.I. Pienaar and the Project contributors |
| 2 | +// |
| 3 | +// SPDX-License-Identifier: Apache-2.0 |
| 4 | + |
| 5 | +package main |
| 6 | + |
| 7 | +import ( |
| 8 | + "context" |
| 9 | + "fmt" |
| 10 | + "os" |
| 11 | + "runtime" |
| 12 | + "strconv" |
| 13 | + |
| 14 | + "github.com/sirupsen/logrus" |
| 15 | + aj "github.com/choria-io/asyncjobs" |
| 16 | + |
| 17 | +{{ range $handler := .Package.TaskHandlers }} |
| 18 | + {{ $handler.TaskType | TypeToPackageName }} "{{ $handler.Package }}" |
| 19 | +{{- end }} |
| 20 | +) |
| 21 | + |
| 22 | +var usage = ` |
| 23 | +Choria Async Jobs Handler Failed: %v |
| 24 | +
|
| 25 | +This is a generated Handler for the Choria Async Jobs Project. |
| 26 | +
|
| 27 | +It hosts the following handlers: |
| 28 | +{{ range $handler := .Package.TaskHandlers }} |
| 29 | + - {{ $handler.TaskType }}: {{ $handler.Package }}.AsyncJobHandler |
| 30 | +{{- end }} |
| 31 | +
|
| 32 | +To run this you need to prepare a NATS context using the nats |
| 33 | +CLI and then mount it into the container on /handler/config/nats. |
| 34 | +
|
| 35 | +The following Environment variables are supported: |
| 36 | +
|
| 37 | + - AJ_WORK_QUEUE: The Work Queue to consume from, defaults to DEFAULT |
| 38 | + - AJ_NATS_CONTEXT: The name of a NATS Context to use for connections |
| 39 | + - AJ_CONCURRENCY: The number of concurrent handlers that can be run |
| 40 | +
|
| 41 | +Prometheus statistics are Exposed on port 8080 as /metrics |
| 42 | +
|
| 43 | +For further information see the project wiki at: |
| 44 | +
|
| 45 | + https://github.com/choria-io/asyncjobs |
| 46 | +
|
| 47 | +Build Information: |
| 48 | +
|
| 49 | + - Build Time: {{ .BuildTime }} |
| 50 | + - Async Jobs Package Version: {{ .Package.AJVersion }} |
| 51 | +
|
| 52 | +` |
| 53 | + |
| 54 | +func usageIfError(err error) { |
| 55 | + if err == nil { |
| 56 | + return |
| 57 | + } |
| 58 | + |
| 59 | + fmt.Printf(usage, err) |
| 60 | + os.Exit(1) |
| 61 | +} |
| 62 | + |
| 63 | +func main() { |
| 64 | + wq := os.Getenv("AJ_WORK_QUEUE") |
| 65 | + if wq == "" { |
| 66 | + usageIfError(fmt.Errorf("AJ_WORK_QUEUE is required")) |
| 67 | + } |
| 68 | + |
| 69 | + nctx := os.Getenv("AJ_NATS_CONTEXT") |
| 70 | + if nctx == "" { |
| 71 | + usageIfError(fmt.Errorf("AJ_NATS_CONTEXT is required")) |
| 72 | + } |
| 73 | + |
| 74 | + var err error |
| 75 | + concurrencyS := os.Getenv("AJ_CONCURRENCY") |
| 76 | + concurrency := runtime.NumCPU() |
| 77 | + if concurrencyS != "" { |
| 78 | + concurrency, err = strconv.Atoi(concurrencyS) |
| 79 | + if err != nil { |
| 80 | + usageIfError(fmt.Errorf("AJ_CONCURRENCY must be numeric")) |
| 81 | + } |
| 82 | + } |
| 83 | + |
| 84 | + logger := logrus.New() |
| 85 | + if os.Getenv("AJ_DEBUG") == "1" { |
| 86 | + logger.SetLevel(logrus.DebugLevel) |
| 87 | + } else { |
| 88 | + logger.SetLevel(logrus.InfoLevel) |
| 89 | + } |
| 90 | + logger.SetFormatter(&logrus.TextFormatter{ |
| 91 | + FullTimestamp: true, |
| 92 | + TimestampFormat: "15:04:05", |
| 93 | + }) |
| 94 | + |
| 95 | + log := logrus.NewEntry(logger) |
| 96 | + |
| 97 | + log.Printf("Connecting using Context %s consuming work queue %s with concurrency %d", nctx, wq, concurrency) |
| 98 | + |
| 99 | + client, err := aj.NewClient( |
| 100 | + aj.NatsContext(nctx), |
| 101 | + aj.BindWorkQueue(wq), |
| 102 | + aj.ClientConcurrency(concurrency), |
| 103 | + aj.CustomLogger(log), |
| 104 | + aj.PrometheusListenPort(8080)) |
| 105 | + usageIfError(err) |
| 106 | + |
| 107 | + router := aj.NewTaskRouter() |
| 108 | +{{ range $handler := .Package.TaskHandlers }} |
| 109 | + err = router.HandleFunc("{{ $handler.TaskType }}", {{ $handler.TaskType | TypeToPackageName }}.AsyncJobHandler) |
| 110 | + usageIfError(err) |
| 111 | +{{- end }} |
| 112 | + |
| 113 | + err = client.Run(context.Background(), router) |
| 114 | + usageIfError(err) |
| 115 | +} |
0 commit comments