https://docs.openstack.org/oslo.messaging/latest/reference/notification_listener.html
通知侦听器用于处理使用messaging
驱动程序的通知程序发送的通知消息。
通知监听器在提供的目标中订阅该主题 - 并且可选地交换 - 。通知程序客户端发送到目标主题/交换的通知消息由侦听器接收。
如果多个侦听器订阅相同的目标,则通知将仅由其中一个侦听器接收。使用尽力而为的循环算法从组中选择接收侦听器。
通过指定侦听器的池名称可以稍微改变此传送模式。具有相同池名称的听众表现得像订阅相同话题/交换的听众组中的一个小组。监听器的每个子组都将收到要由小组的一个成员使用的通知的副本。因此,将传递通知的多个副本 - 一个传递给没有池名称(如果存在)的侦听器组,以及一个侦听器的每个子组共享相同的池名称。
请注意,并非所有传输驱动程序都已实现对侦听器池的支持。如果池名称指定为get_notification_listener(),那些不支持池的驱动程序将引发NotImplementedError。
通知侦听器公开了许多端点,每个端点都包含一组方法。每个方法的名称对应于通知的优先级。当收到通知时,它将被分派到名为通知优先级的方法 - 例如info
通知被分派到info()方法等。
可选地,通知端点可以定义一个NotificationFilter。不符合过滤器规则的通知消息不会传递到端点的方法。
端点方法的参数是:客户端提供的请求上下文,通知消息的publisher_id,event_type,有效负载和元数据。元数据参数是包含唯一message_id和时间戳的映射。
端点方法可以明确返回oslo_messaging.NotificationResult.HANDLED来确认消息或oslo_messaging.NotificationResult.REQUEUE来重新发送消息。请注意,并非所有的传输驱动程序都支持重新进行请求。为了使用此功能,应用程序应该通过将allow_requeue = True传递给get_notification_listener()来声明该功能是可用的。如果驱动程序不支持requeueing,则会在此时引发NotImplementedError。
仅当所有端点返回oslo_messaging.NotificationResult.HANDLED或None时才会确认该消息。
每个通知监听器都与一个执行程序相关联,该执行程序控制着将如何接收和分派传入通知消息。有关其他类型的执行程序的说明,请参阅Executor文档。
注意:如果使用“eventlet”执行程序,则需要对线程和时间库进行monkeypatched。
通知侦听器具有start(),stop()和wait()消息以开始处理请求,停止处理请求并在侦听器停止后等待所有进程内请求完成。
要创建通知侦听器,您需要提供传输,目标列表和端点列表。
只需调用get_notification_transport()方法即可获得传输方式:
#notification_listener.py
from oslo_config import cfg
import oslo_messaging as messaging
class NotificationEndPoint(object):
def warn(self, ctxt, publisher_id, event_type, payload, metadata):
#do_something(payload)
print 'warn'
class ErrorEndpoint(object):
def error(self, ctxt, publisher_id, event_type, payload, metadata):
#do_something(payload)
print 'publisher_id=%s, event_type=%s, payload=%s, metadata=%s' %(publisher_id,event_type,payload,metadata)
transport = messaging.get_transport(cfg.CONF)
targets = [
messaging.Target(topic='notifications'),
messaging.Target(topic='notifications_bis')
]
endpoints = [
NotificationEndPoint(),
ErrorEndpoint(),
]
listener = messaging.get_notification_listener(transport,
targets,
endpoints)
listener.start()
listener.wait()
#notification_send.py
from oslo_config import cfg
import oslo_messaging as messaging
transport = messaging.get_transport(cfg.CONF)
notifier = messaging.Notifier(transport, driver='messaging', topic='notifications')
notifier2 = notifier.prepare(publisher_id='compute')
notifier2.error(ctxt={}, event_type='my_type', payload={'content': 'error occurred'})
notifier2.warn(ctxt={}, event_type='my_type', payload={'content': 'error occurred'})
启动了多个notification_listener,使用notification_send发送,每次只有一个notification_listener,收到消息,符合官方解释的notification_filter。