RabbitMQ 入门 (Go) - 6. 数据持久化(上) (3)

但是我把接口里     AddListener 的第二个参数,也就是回调函数里面的参数类型改为了 interface{},从而可以接收多种类型的数据。

相应的,后边所有涉及事件数据参数的地方都改为     interface{}
          

现在 EventAggregator 被泛化了,我也可以发布其它类型的事件了。

来到 queuelistener.go,我想在协调器发现数据源之后,发布一个事件:

RabbitMQ 入门 (Go) - 6. 数据持久化(上)

这个事件的名称叫做 DataSourceDiscovered,事件数据就是 Queue 的名称,由于这个参数的类型是 interface{},所以它可以正常的传递进去。

 

创建数据的使用者

RabbitMQ 入门 (Go) - 6. 数据持久化(上)

 

 

目前,我们整个系统的设计一共有三层,而数据源和数据的使用者是通过协调器分开的。这样做的好处是,关于如何处理消息的业务逻辑都集中在协调器这一层上面了,而数据源和数据使用者层仅关注它们自身的任务即可。

为了达到这个目的,需要在 coordinator 目录下创建一个 databaseconsumer.go 文件:

RabbitMQ 入门 (Go) - 6. 数据持久化(上)

这个文件的作用是监听整个系统发出的事件,并决定哪些事件可以转发到数据管理包(我一会要建立的)。

 

dataconsumer.go

首先看一下 dataconsumer.go 文件的内容:

RabbitMQ 入门 (Go) - 6. 数据持久化(上)

 15 行建立 DatabaseConsumer struct,它有5个字段:

第一个字段类型是 EventRaiser 接口,该接口只能用于监听,而不能发布事件,这就是该接口的目的。

接下来三个字段都是与 RabbitMQ 相关的。

最后一个字段是注册的监听器的 Queue 名称的集合。

 23 行,为 DatabaseConsumer 创建一个构造函数。它接收 EventRaiser 作为参数,并创建 RabbitMQ 相关的连接、ChannelQueue  DatabaseConsumer 各字段赋值。

 29 行创建 Queue 时用到了一个 Queue 的名称,这个 Queue 是用来做持久化的,它是众所周知的,它的名称存放在 queuetools.go 文件里:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxgds.html