Newer
Older
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
package cmd
import (
"os"
"os/signal"
"syscall"
"github.com/jessevdk/go-flags"
"xbus.io/go-xbus/v4"
)
func SetupXbusServeCmd(program *Program, cmd *flags.Command) *XbusServeCmd {
serveCmd := XbusServeCmd{
program: program,
}
_, err := cmd.AddCommand("serve", "Start a standalone xbus client", "", &serveCmd)
if err != nil {
panic(err)
}
return &serveCmd
}
type XbusServeCmd struct {
program *Program
NoReconnect bool `long:"no-reconnect" description:"When the connection to xbus is lost, stops the program instead of attempting a reconnection"`
}
func (cmd *XbusServeCmd) Execute([]string) error {
coptions, err := cmd.program.xbusClientOptions()
if err != nil {
return err
}
coptions.ForceStart = !cmd.NoReconnect
coptions.NoReconnect = cmd.NoReconnect
if err := cmd.program.xbusRegisterActors(); err != nil {
return err
}
defer cmd.program.xbusUnregisterActors()
client := xbus.NewClient(coptions, cmd.program.Logger, cmd.program.LoggingOptions.Output())
if err := cmd.program.EnsureDB(false); err != nil {
return err
}
if err := client.Startup(true); err != nil {
if client.GetConn() != nil {
client.Close()
}
return err
}
cmd.program.Logger.Info().Msg("Xbus client ready")
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM)
select {
case <-interrupt:
client.Shutdown()
case <-client.Done():
return nil
}
return nil
}