iservice.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # -*- coding: utf-8 -*-
  2. """
  3. Basis-Interface für alle Trixy-Services.
  4. Definiert den Lebenszyklus und die Struktur von Services.
  5. """
  6. from abc import ABC, abstractmethod
  7. from typing import TYPE_CHECKING, ClassVar
  8. from trixy_core.service.enums import ServicePriority, ServiceGroup, ServiceState
  9. if TYPE_CHECKING:
  10. from trixy_core.application import IApplication
  11. class IService(ABC):
  12. """
  13. Abstrakte Basisklasse für alle Trixy-Services.
  14. Jeder Service muss diese Klasse erweitern und die abstrakten
  15. Methoden implementieren. Der ServiceContainer verwaltet den
  16. Lebenszyklus basierend auf PRIORITY und DEPENDENCIES.
  17. Klassenattribute:
  18. PRIORITY: Startreihenfolge (niedrigere Werte = früher)
  19. GROUP: Kategorisierung des Services
  20. DEPENDENCIES: Liste der benötigten Service-Namen
  21. NAME: Eindeutiger Name des Services (Standard: Klassenname)
  22. """
  23. # Klassenattribute (überschreiben in Unterklassen)
  24. PRIORITY: ClassVar[ServicePriority] = ServicePriority.OPTIONAL
  25. GROUP: ClassVar[ServiceGroup] = ServiceGroup.UTILITY
  26. DEPENDENCIES: ClassVar[list[str]] = []
  27. NAME: ClassVar[str] = ""
  28. def __init__(self, application: "IApplication") -> None:
  29. """
  30. Initialisiert den Service.
  31. Args:
  32. application: Referenz zur Hauptanwendung
  33. """
  34. self._application = application
  35. self._state = ServiceState.STOPPED
  36. @property
  37. def application(self) -> "IApplication":
  38. """Gibt die Anwendungsreferenz zurück."""
  39. return self._application
  40. @property
  41. def state(self) -> ServiceState:
  42. """Gibt den aktuellen Service-Zustand zurück."""
  43. return self._state
  44. @property
  45. def name(self) -> str:
  46. """Gibt den Service-Namen zurück."""
  47. return self.NAME or self.__class__.__name__
  48. @property
  49. def is_running(self) -> bool:
  50. """Prüft, ob der Service läuft."""
  51. return self._state == ServiceState.RUNNING
  52. def _set_state(self, state: ServiceState) -> None:
  53. """Setzt den internen Zustand."""
  54. self._state = state
  55. async def on_pre_start(self) -> None:
  56. """
  57. Hook vor dem Start des Services.
  58. Wird aufgerufen, bevor start() ausgeführt wird.
  59. Kann für Vorbereitungen genutzt werden.
  60. """
  61. pass
  62. async def on_post_start(self) -> None:
  63. """
  64. Hook nach dem Start des Services.
  65. Wird aufgerufen, nachdem start() erfolgreich war.
  66. """
  67. pass
  68. async def on_pre_stop(self) -> None:
  69. """
  70. Hook vor dem Stoppen des Services.
  71. Wird aufgerufen, bevor stop() ausgeführt wird.
  72. """
  73. pass
  74. async def on_post_stop(self) -> None:
  75. """
  76. Hook nach dem Stoppen des Services.
  77. Wird aufgerufen, nachdem stop() ausgeführt wurde.
  78. """
  79. pass
  80. async def on_dependency_ready(self, dependency_name: str) -> None:
  81. """
  82. Hook wenn eine Abhängigkeit bereit ist.
  83. Wird aufgerufen, wenn ein Service aus DEPENDENCIES
  84. erfolgreich gestartet wurde.
  85. Args:
  86. dependency_name: Name des gestarteten Abhängigkeits-Services
  87. """
  88. pass
  89. @abstractmethod
  90. async def start(self) -> None:
  91. """
  92. Startet den Service.
  93. Muss von Unterklassen implementiert werden.
  94. Raises:
  95. Exception: Bei Fehlern während des Starts
  96. """
  97. pass
  98. @abstractmethod
  99. async def stop(self) -> None:
  100. """
  101. Stoppt den Service.
  102. Muss von Unterklassen implementiert werden.
  103. Sollte Ressourcen freigeben und sauber herunterfahren.
  104. """
  105. pass
  106. async def health_check(self) -> bool:
  107. """
  108. Führt eine Gesundheitsprüfung durch.
  109. Kann von Unterklassen überschrieben werden, um
  110. spezifische Prüfungen durchzuführen.
  111. Returns:
  112. True wenn der Service gesund ist, sonst False
  113. """
  114. return self._state == ServiceState.RUNNING