1 方法调用流程
1.1 notify.notifier.Notifier.sample
oslo_messaging.notify.notifier.Notifier.sample ->
oslo_messaging.notify.notifier.Notifier._notify ->
oslo_messaging.notify.messaging.MessagingV2Driver.notify ->
oslo_messaging.transport.NotificationTransport._send_notification ->
oslo_messaging._drivers.impl_rabbitmq.RabbitDriver.send_notification ->
oslo_messaging._drivers.impl_rabbitmq.RabbitDriver.send_notification ->(方法用父类的)
_drivers.impl_rabbitmq.RabbitDriver._send ->(从pool get一个connection,是impl_rabbitmq的connection,调connection的notify_send方法,pool好像在transport还是driver初始化时赋值)
_drivers.impl_rabbitmq.Connection.notify_send ->
_drivers.impl_rabbitmq.Connection._ensure_publishing ->(装饰方法实际调用Connection._publlish_and_create_default_queue,后面会调到,此处调方法用了偏函数,固定部分入参,如exchange,routing_key等,然后重新返回方法)
_drivers.impl_rabbitmq.Connection.ensure ->
_drivers.impl_rabbitmq.Connection._publish ->
kombu.messaging:Producer._publish -> (producer在kombu.connection:Connection.autoretry装饰时实例化,具体在_set_current_channel中实例化,autoretry中为impl_rabbit.Connection._publlish_and_create_default_queue方法传入channel,为kombu.connection:Connection.default_channel)
amqp.channel:Channel.basic_publish ->
amqp.channel._basic_publish ->
amqp.channel.send_method ->
amqp.connection.Connection.frame_writer,最后该方法调so库struct的pack_info发送消息
1.2 小结
库调用顺序 oslo_messaging -> kombu -> amqp
作用:
oslo_messaging提供统一transport, driver等接口
kombu:实例化connection, transport等
amqp:提供具体发送消息底层库的接口和调用