msrc

Форк
0
/
SimpleService.go 
80 строк · 2.8 Кб
1
package msrc
2

3
import (
4
	"context"
5
	"time"
6

7
	"gitlab.systems-fd.com/packages/golang/helpers/h"
8
)
9

10
// simpleService реализует интерфейс ServiceInterface для объединения его
11
// с SimpleService. Под капотом имплементирует функционал основного интерфейса.
12
type simpleService struct {
13
	service           SimpleService
14
	serviceCancelFunc *h.SyncValueStruct[context.CancelFunc]
15

16
	isStarted *h.SyncValueStruct[bool]
17
	isAlive   *h.SyncValueStruct[bool]
18

19
	graceStopPeriod time.Duration
20
}
21

22
// NewSimpleService реализует фабрику полноценного сервиса на основе переданного
23
// SimpleService. Вторым аргументом функция принимает не обязательный параметр
24
// graceStopPeriod, который отвечает за то, сколько времени (сек) необходимо ожидать
25
// правильного завершения сервиса. По умолчанию это значение - 5 сек.
26
// Если значение передано как 0 - время ожидания составит 1000 часов, что по сути
27
// будет означать ожидание полной, правильной остановки.
28
func NewSimpleService(service SimpleService, graceStopPeriod ...uint8) ServiceInterface {
29
	if 0 == len(graceStopPeriod) {
30
		graceStopPeriod = append(graceStopPeriod, 5)
31
	}
32

33
	gracePeriod := 1000 * time.Hour
34
	if graceStopPeriod[0] > 0 {
35
		gracePeriod = time.Duration(graceStopPeriod[0]) * time.Second
36
	}
37

38
	return &simpleService{
39
		service:           service,
40
		serviceCancelFunc: h.SyncValue[context.CancelFunc](func() {}),
41
		isStarted:         h.SyncValue[bool](false),
42
		isAlive:           h.SyncValue[bool](false),
43
		graceStopPeriod:   gracePeriod,
44
	}
45
}
46

47
// Run выполняет запуск сервера
48
func (s *simpleService) Run() error {
49
	s.isStarted.Set(true)
50

51
	s.isAlive.Set(true)
52
	defer s.isAlive.Set(false)
53

54
	ctx, cancel := context.WithCancel(context.Background())
55
	defer cancel()
56

57
	s.serviceCancelFunc.Set(cancel)
58

59
	return s.service.Run(ctx)
60
}
61

62
// GracefulShutdown выполняет правильную остановку сервиса
63
func (s *simpleService) GracefulShutdown() {
64
	s.serviceCancelFunc.Get()()
65

66
	ctx, cancel := context.WithTimeout(context.Background(), s.graceStopPeriod)
67
	defer cancel()
68

69
	_ = h.EorSOne(s.service.GracefulShutdown)(s.graceStopPeriod)(ctx)
70
}
71

72
// IsStarted возвращает статус состояния запуска сервиса
73
func (s *simpleService) IsStarted() bool {
74
	return s.isStarted.Get()
75
}
76

77
// IsAlive возвращает статус сервиса: живой или нет
78
func (s *simpleService) IsAlive() bool {
79
	return s.isAlive.Get()
80
}
81

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.