msrc
/
SimpleService.go
80 строк · 2.8 Кб
1package msrc
2
3import (
4"context"
5"time"
6
7"gitlab.systems-fd.com/packages/golang/helpers/h"
8)
9
10// simpleService реализует интерфейс ServiceInterface для объединения его
11// с SimpleService. Под капотом имплементирует функционал основного интерфейса.
12type simpleService struct {
13service SimpleService
14serviceCancelFunc *h.SyncValueStruct[context.CancelFunc]
15
16isStarted *h.SyncValueStruct[bool]
17isAlive *h.SyncValueStruct[bool]
18
19graceStopPeriod time.Duration
20}
21
22// NewSimpleService реализует фабрику полноценного сервиса на основе переданного
23// SimpleService. Вторым аргументом функция принимает не обязательный параметр
24// graceStopPeriod, который отвечает за то, сколько времени (сек) необходимо ожидать
25// правильного завершения сервиса. По умолчанию это значение - 5 сек.
26// Если значение передано как 0 - время ожидания составит 1000 часов, что по сути
27// будет означать ожидание полной, правильной остановки.
28func NewSimpleService(service SimpleService, graceStopPeriod ...uint8) ServiceInterface {
29if 0 == len(graceStopPeriod) {
30graceStopPeriod = append(graceStopPeriod, 5)
31}
32
33gracePeriod := 1000 * time.Hour
34if graceStopPeriod[0] > 0 {
35gracePeriod = time.Duration(graceStopPeriod[0]) * time.Second
36}
37
38return &simpleService{
39service: service,
40serviceCancelFunc: h.SyncValue[context.CancelFunc](func() {}),
41isStarted: h.SyncValue[bool](false),
42isAlive: h.SyncValue[bool](false),
43graceStopPeriod: gracePeriod,
44}
45}
46
47// Run выполняет запуск сервера
48func (s *simpleService) Run() error {
49s.isStarted.Set(true)
50
51s.isAlive.Set(true)
52defer s.isAlive.Set(false)
53
54ctx, cancel := context.WithCancel(context.Background())
55defer cancel()
56
57s.serviceCancelFunc.Set(cancel)
58
59return s.service.Run(ctx)
60}
61
62// GracefulShutdown выполняет правильную остановку сервиса
63func (s *simpleService) GracefulShutdown() {
64s.serviceCancelFunc.Get()()
65
66ctx, cancel := context.WithTimeout(context.Background(), s.graceStopPeriod)
67defer cancel()
68
69_ = h.EorSOne(s.service.GracefulShutdown)(s.graceStopPeriod)(ctx)
70}
71
72// IsStarted возвращает статус состояния запуска сервиса
73func (s *simpleService) IsStarted() bool {
74return s.isStarted.Get()
75}
76
77// IsAlive возвращает статус сервиса: живой или нет
78func (s *simpleService) IsAlive() bool {
79return s.isAlive.Get()
80}
81