import asyncio import logging import logging.config import os from asyncio import Future from amqp.adapter.amq_message_factory import AMQMessageFactory from amqp.adapter.amq_route_factory import AMQRouteFactory from amqp.adapter.clever_swarm_adapter import CleverSwarmAdapter from amqp.adapter.service_message_factory import CleverMicroServiceMessageFactory from amqp.config.amq_configuration import AMQConfiguration from amqp.model.model import AMQMessage, AMQRoute from amqp.rabbitmq.rabbit_mq_consumer import RabbitMQConsumer from amqp.service.service_message_handler import AMQServiceMessageHandler from amqp.service.tracing import initialize_trace logging.basicConfig(level=logging.DEBUG) logging.info(f"CWD = {os.getcwd()}") logging_conf_path = os.path.join(os.getcwd(), 'amqp', 'service', 'logging.conf') if os.path.exists(logging_conf_path): logging.config.fileConfig(logging_conf_path) else: logging_conf_path = os.path.join(os.getcwd(), 'logging.conf') if os.path.exists(logging_conf_path): logging.config.fileConfig(logging_conf_path) class AMQService: CLEVER_AMQP_CLIENT_VERSION = os.getenv("CLEVER_AMQP_CLIENT_VERSION") MAX_WAIT = 300 # defaults to 5 minutes (300 seconds) def __init__(self, amq_configuration: AMQConfiguration, http_adapter): logging.info("***********************************************") logging.info("********** AMQ Service *******************") logging.info("***********************************************") self.amq_configuration = amq_configuration self.http_adapter = http_adapter self.message_factory = AMQMessageFactory.get_instance(self.amq_configuration.amq_adapter.generator_id) self.rabbit_mq_consumer = RabbitMQConsumer(self.amq_configuration) self.tracer = initialize_trace(name=amq_configuration.amq_adapter.service_name) self.amq_service_message_handler = AMQServiceMessageHandler(self.http_adapter, self.tracer, self.message_factory) self.service_message_factory = CleverMicroServiceMessageFactory( self.amq_configuration.amq_adapter.service_name ) self.register_routes() # self.consumer_thread = asyncio.create_task(self.rabbit_mq_consumer.channel.start_consuming()) # self.rabbit_mq_consumer.request_routes() logging.info("***********************************************") logging.info("****** AMQ Service Init Complete *********") logging.info("***********************************************") def cleanup(self): logging.info(" [DBG] AMQService.cleanup() rmqc=%s", self.rabbit_mq_consumer) if self.rabbit_mq_consumer: self.rabbit_mq_consumer.cleanup() def reinitialize_if_disconnected(self): if not self.rabbit_mq_consumer.channel or not self.rabbit_mq_consumer.channel.is_open: self.rabbit_mq_consumer = RabbitMQConsumer(self.amq_configuration) self.register_routes() self.rabbit_mq_consumer.request_routes() def register_routes(self): route_mapping = self.amq_configuration.amq_adapter.route_mapping if AMQRouteFactory.validate(route_mapping): try: self.rabbit_mq_consumer.register_inbound_routes( self.amq_service_message_handler.inbound_message_callback_http ) self.rabbit_mq_consumer.register_rpc_handler( self.amq_service_message_handler.reply_received_callback ) except Exception as e: raise RuntimeError(e) elif route_mapping: logging.info(" [W] route [%s] failed validation, no routes were registered.", route_mapping) def send_message(self, message: AMQMessage, future: Future): self.amq_service_message_handler.outstanding[str(message.id)] = future def remove_outstanding_future(self, message_id: str): self.amq_service_message_handler.outstanding.pop(message_id, None) if __name__ == "__main__": amq_configuration: AMQConfiguration = AMQConfiguration() amq_service: AMQService = AMQService(amq_configuration, CleverSwarmAdapter(amq_configuration)) amq_service.rabbit_mq_consumer.channel.start_consuming() # amq_service.consumer_thread.cancel() # amq_service.rabbit_mq_consumer.connection.close()