service.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // package service -- главный тип сервиса шины данных
  2. package service
  3. import (
  4. "context"
  5. "fmt"
  6. "log"
  7. "p78git.ddns.net/svi/gobus/internal/dict_topic"
  8. "p78git.ddns.net/svi/gobus/internal/serv_grpc"
  9. "p78git.ddns.net/svi/gobus/pkg/types"
  10. )
  11. // Service -- главный тип сервиса шины данных
  12. type Service struct {
  13. ctxBg context.Context // Неотменяемый контекст приложения
  14. ctx context.Context // Отменяемый контекст приложения
  15. fnCancel func() // Функция отмены контекста приложения
  16. dictTopic types.IDictTopic // Потокобезопасный словарь топиков
  17. servGrpc *serv_grpc.ServGrpc
  18. }
  19. // NewSevice -- взвращае тновый сервис
  20. func NewSevice() (*Service, error) {
  21. log.Printf("NewService()\n")
  22. sf := &Service{
  23. ctxBg: context.Background(),
  24. }
  25. sf.ctx, sf.fnCancel = context.WithCancel(sf.ctxBg)
  26. var err error
  27. sf.dictTopic, err = dict_topic.NewDictTopic()
  28. if err != nil {
  29. return nil, fmt.Errorf("NewService(): in create DictTopic, err=\n\t%w", err)
  30. }
  31. sf.servGrpc, err = serv_grpc.NewServGrpc(sf)
  32. if err != nil {
  33. return nil, fmt.Errorf("NewService(): in create ServGrpc, err=\n\t%w", err)
  34. }
  35. return sf, nil
  36. }
  37. // Run -- запускает сервис в работу
  38. func (sf *Service) Run() error {
  39. log.Printf("Service.Run()\n")
  40. sf.servGrpc.Run()
  41. <-sf.ctx.Done()
  42. return nil
  43. }
  44. // Ctx -- возвращает контекст приложения
  45. func (sf Service) Ctx() context.Context {
  46. return sf.ctx
  47. }
  48. // CancelApp -- отменяет контекст приложения
  49. func (sf *Service) CancelApp() {
  50. sf.fnCancel()
  51. }