我正在尝试开发一些消息传递系统,它可以同时使用 ZeroMQ 和 RabbitMQ(可能更像是 activeMQ)。
所以我是这样想的:
我的消息系统中的组件可以是发送者或接收者。他们都有一些地址,所以我需要概括。所以我创建了它——AbstractMessagingNode,它有两个更精细的抽象:AbstractReceiver 和 AbstractSender。
class AbstractMessagingNode():
__metaclass__ = ABCMeta
def __init__(self, host):
self.host = host
class AbstractReceiver(AbstractMessagingNode):
__metaclass__ = ABCMeta
callback = None
host = None
def __init__(self, host, on_receive_callback):
super(AbstractReceiver, self).__init__(host)
self.callback = on_receive_callback
def on_message_received(self, *args):
self.callback(*args)
class AbstractSender(AbstractMessagingNode):
__metaclass__ = ABCMeta
@abstractmethod
def send_message(self, message):
pass
起初我只使用rabbitmq。所以我为此创建了两个更精致的抽象(基本上将它们视为具体实现)
class BaseRabbitSender(AbstractSender):
__metaclass__ = ABCMeta
default_port_number = 5672
def __init__(self, host):
super(BaseRabbitSender, self).__init__(host)
self.connection = pika.BlockingConnection(pika.ConnectionParameters(
host=host))
self.channel = self.connection.channel()
@abstractmethod
def send_message(self, message):
pass
def close_connection(self):
self.connection.close()
ETC...
所有这些都运行良好,直到我尝试将 zmq 加入其中。
问题是 zmqnode 也可以是发送者或接收者(在我的情况下)。但是接收者和发送者都需要通用的方法和字段。我试图用这个类来捕捉它
class AbstractZmqNode(AbstractMessagingNode):
__metaclass__ = ABCMeta
def __init__(self, host, port):
super(AbstractZmqNode, self).__init__(host)
self.port = port
self.context = zmq.Context()
def set_hwm(self, hwm):
self.socket.set_hwm(hwm)
@staticmethod
def build_address(host, port):
strings = [host, ':', str(port)]
return ''.join(strings)
但这会产生代码重复的问题,因为在这种情况下,我还需要 AbstractZmqSender 和 AbstractZmqReceiver,这不好。
我正在考虑桥接模式,但不知道从哪里开始,因为在桥接模式的所有示例中,抽象只是一个接口,但在我的情况下它有一些数据字段。
我愿意接受您的帮助和建议。