OpenFactoryApp#
- class openfactory.apps.ofaapp.OpenFactoryApp(app_uuid, ksqlClient, bootstrap_servers=None, loglevel='INFO')[source]#
Bases:
AssetGeneric OpenFactory application.
Inherits from Asset and extends it to represent an OpenFactory application with standard metadata, logging, and lifecycle management.
- APPLICATION_VERSION#
Class attribute. Version string from APPLICATION_VERSION environment variable or ‘latest’.
- Type:
- APPLICATION_MANUFACTURER#
Class attribute. Manufacturer from APPLICATION_MANUFACTURER environment variable or ‘OpenFactory’.
- Type:
- APPLICATION_LICENSE#
Class attribute. License string from APPLICATION_LICENSE environment variable or ‘BSD-3-Clause license’.
- Type:
- logger#
Instance attribute. Prefixed logger instance configured with the app UUID.
- Type:
- storage#
Storage backend instance created from the STORAGE environment variable, or None if not configured.
- Type:
Optional[FileBackend]
- Example usage:
import time import os from openfactory.apps import OpenFactoryApp from openfactory.kafka import KSQLDBClient class DemoApp(OpenFactoryApp): def main_loop(self): # For actual use case, add here your logic of the app print("I don't do anything useful in this example.") counter = 1 while True: print(counter) counter += 1 time.sleep(2) def app_event_loop_stopped(self): # Not absolutely required as it is already done by the `KSQLDBClient` class self.ksql.close() # When the Application is deployed on the OpenFactory Cluster, the # environment variables KSQLDB_URL and KAFKA_BROKER will be set. # The default values can be used for local development. app = DemoApp( app_uuid='DEMO-APP', ksqlClient=KSQLDBClient(os.getenv("KSQLDB_URL", "http://localhost:8088")), bootstrap_servers=os.getenv("KAFKA_BROKER", "localhost:9092") ) app.run()
- __init__(app_uuid, ksqlClient, bootstrap_servers=None, loglevel='INFO')[source]#
Initializes the OpenFactory application.
Sets up the application UUID, storage backend (if configured), standard attributes (version, manufacturer, license), a prefixed logger, and termination signal handlers.
- Parameters:
app_uuid (str) – The UUID of the application (overrides the environment variable APP_UUID if provided).
ksqlClient (KSQLDBClient) – The KSQL client instance.
bootstrap_servers (str) – Kafka bootstrap server URL, default value is read from config.KAFKA_BROKER.
loglevel (str) – Logging level for the app (e.g., ‘INFO’, ‘DEBUG’). Defaults to ‘INFO’.
- Side effects:
Configures logging with the application UUID as prefix.
Mounts a storage backend if the STORAGE environment variable is set.
Registers signal handlers for SIGINT and SIGTERM.
- async async_main_loop()[source]#
Async main loop of the OpenFactory App.
This method must be implemented by child classes to define the main application loop behavior. It will be responsible for managing the application’s lifecycle, handling events, and maintaining any necessary state while the application is running.
- Return type:
- Raises:
NotImplementedError – If this method is not implemented by a subclass.
- async async_run()[source]#
Run the OpenFactory app asynchronously.
- Return type:
- Parameters:
async_main_loop – Async function to use as the main loop
- main_loop()[source]#
Main loop of the OpenFactory App.
This method must be implemented by child classes to define the main application loop behavior. It will be responsible for managing the application’s lifecycle, handling events, and maintaining any necessary state while the application is running.
- Return type:
- Raises:
NotImplementedError – If this method is not implemented by a subclass.
- run()[source]#
Runs the OpenFactory app.
This method initializes the app by displaying a welcome banner, adding an availability attribute, and then starts the main application loop by calling main_loop. If an exception occurs during the execution of the main loop, the error is caught, and the app is gracefully stopped.
The following steps are performed:
Display the welcome banner.
Add the avail attribute with ‘AVAILABLE’ value.
Start the main loop.
Catch any exceptions that occur and stop the app gracefully.
- signal_handler(signum, frame)[source]#
Handles SIGINT and SIGTERM signals, gracefully stopping the application.
This method listens for termination signals, deregisters the asset from the system, and then stops the application’s event loop. It is typically used to handle clean shutdowns when the app receives signals like SIGINT or SIGTERM.