针对传感器传送数据的 Queue,我要让它能够保留下来,所以 autoDelete 就是 false
而 discoveryQueue 是用来监听协调器的“发现”请求的,我想让每个传感器每次上线都会得到一个新的 Queue,这里 autoDelete 就设置为 true,这样的话 RabbitMQ 就会把旧的 Queue 自动清理掉。
调整 queuelistener.go 里面的调用:
这里得到的临时 Queue 是用来监听传感器上线时或响应协调器发现请求时来发布数据 Queue 名称的。
这里函数调用的 autoDelete 参数也设置为 true,从而让它们可以自动被清除掉。
测试运行
把之前的 Queue 都删掉:
然后再运行 5 个传感器和2 个协调器:
现在又是很多的 Queue。
然后我们再停掉所有的传感器和协调器:
可以看到传感器传送数据的 Queue 被保留了,而其它的临时 Queue 都自动删除掉了,这就是我们想要的效果。
泛化事件数据
到目前为止,系统中只发布了一种类型的事件(接收到传感器数据时的事件),而且目前还没有任何使用者监听这个事件。接下来我们就要完善事件这部分功能了,但首先必须做出一些优化修改,以便能真正满足需求。
目前 eventaggregator.go 里面包含了所有添加监听者以及向监听者发布事件的方法。
但现在的情况是事件的使用者也知道如何自行发布事件,这点不太好,因为它们不需要这样做。代码修改如下:
为了尽量少的暴露功能,我为事件的使用者创建了 EventRaiser 这个接口,它里面只有一个 AddListener 方法,与已经实现的 AddListener 方法相几乎完全匹配。