service.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. ctxBg := context.Background()
  25. ctx, fnCancel := context.WithCancel(ctxBg)
  26. sf := &Service{
  27. ctxBg: ctxBg,
  28. ctx: ctx,
  29. fnCancel: fnCancel,
  30. dictTopic: dict_topic.NewDictTopic(),
  31. }
  32. var err error
  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. }