cml04-l2-rsm-in/internal/app/app.go

94 lines
2.5 KiB
Go
Raw Normal View History

2024-08-20 10:08:32 +02:00
package app
import (
"flag"
"os"
"os/signal"
"syscall"
cml04eventer "git.espin.casa/albert/cml04-eventer"
"git.espin.casa/albert/cml04-gdm-int/pkg/api"
"git.espin.casa/albert/cml04-l2-rsm-in/internal/logging"
"git.espin.casa/albert/cml04-l2-rsm-in/internal/server"
"git.espin.casa/albert/cml04-l2-rsm-in/internal/service"
"git.espin.casa/albert/logger"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func Run() error {
// flags
l2InAddr := flag.String("l2-in-addr", "0.0.0.0:5012", "tcp l2 server address")
apiAddr := flag.String("l2-out-addr", "localhost:3333", "tcp adress")
nsqAddr := flag.String("nsq-addr", "10.1.152.13", "nsq server address")
nsqPort := flag.Int("nsq-port", 4150, "nsq server port")
logLevel := flag.String("log-level", "debug", "trace debug level")
flag.Parse()
// setup logger
log := logger.New(os.Stdout, *logLevel)
// log fields
logFields := logger.LogFields{
"log_level": *logLevel,
"l2_in_address": *l2InAddr,
"api_adress": *apiAddr,
"nsq_address": *nsqAddr,
"nsq_port": *nsqPort,
}
// create event publisher
publisher, err := cml04eventer.NewPublisher(&cml04eventer.PublisherImplConfig{
NSQAddress: *nsqAddr,
NSQPort: *nsqPort,
Marshaler: cml04eventer.JSONMarshaler{},
}, log)
if err != nil {
log.Error("failed to create event publisher", err, logFields)
return err
}
defer publisher.Close()
// api dial
conn, err := grpc.Dial(*apiAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Error("failed to dial api server", err, logger.LogFields{})
}
// create api client
client := api.NewRollDataServiceClient(conn)
defer conn.Close()
// create service
svc := service.NewService(client, publisher)
svc = logging.NewLoggingService(log, svc)
// create server
server := server.NewServer(*l2InAddr, log, svc)
// start tcp server (telegrams)
go func() {
if err := server.Run(); err != nil {
log.Error("server error", err, logFields)
}
}()
// info banner
log.Info("started cml04-l2-rsm-in telegram service", logFields)
// wait signal to finish
signal := WaitSignal()
log.Info("signal received", logFields.Add(logger.LogFields{
"signal": signal,
}))
return nil
}
// WaitSignal catching exit signal
func WaitSignal() os.Signal {
ch := make(chan os.Signal, 2)
signal.Notify(
ch,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGTERM,
)
for {
sig := <-ch
switch sig {
case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM:
return sig
}
}
}