service.go 2.6 KB

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