使用Golang的事件监听器和调度器实例

533 阅读2分钟

在这个例子中,我们将有两种类型的Golang的事件驱动编程例子。它们彼此非常相似,但两者的主要区别在于通道的使用。第一个例子不使用通道。你永远不会接触到internal/pkg/event 文件夹,所以你可以把它看作是一个外部库包。user 文件夹是你的代码。

这是一个有主见但非常直接的 "甚至驱动 "的例子。事件以某种方式被派发,然而处理的方式由你决定。派遣事件可以用阻塞或非阻塞的方式处理(如goroutine)。它有三个简单的步骤,如下所列。

  1. 创建一个事件调度器的实例。(在应用程序启动时完成)

  2. 注册事件和监听器。(在应用启动阶段完成)

  3. 派遣事件。

属性

  • 一个调度器可以注册许多监听器。

  • 一个调度器可以为一个特定的听众注册许多事件。

  • 一个调度器可以调度许多事件。

  • 一个监听器可以监听许多事件。

  • 一个事件可以链接到一个事件类型。

  • 调度器防止注册重复的事件。

  • 调度器防止调度非注册的事件。

例子1 - 没有通道

结构

├── cmd

文件

cmd/client/main.go
package main
internal/pkg/event/dispatcher.go
package event
internal/pkg/event/event.go
package event
internal/pkg/event/listener.go
package event
internal/user/created.go
package user
internal/user/deleted.go
package user
internal/user/updated.go
package user
internal/user/listener.go
package user

测试

2020/05/27 21:08:53 creating: {Time:2020-05-27 20:08:53.272564 +0000 UTC ID:111}

例子2--有渠道(优先)的例子

如果你想实现通道优先选项,你可以看看我之前写的博文。**注意:**查看下面的第三个例子(后期添加)。

结构

├── cmd

文件

cmd/client/main.go
package main
internal/pkg/event/dispatcher.go
package event
internal/pkg/event/event.go
package event
内部/pkg/event/job.go
package event
internal/pkg/event/listener.go
package event
internal/user/created.go
package user
internal/user/deleted.go
package user
internal/user/updated.go
package user
internal/user/listener.go
package user

测试

2020/05/27 21:12:01 creating: {Time:2020-05-27 20:12:01.556947 +0000 UTC ID:111}

例子3--没有通道

只是想让你知道,这是本文章的一个最新补充。与上面两个例子相比,这是一个简化版本。你不需要实现你的监听器。你所要做的就是,创建你的事件并像往常一样注册。这就是全部。如果你在这个例子中加入了通道功能,你可以认为它是首选版本无论怎样,这都是我的首选。

结构

├── cmd

文件

cmd/client/main.go
package main
internal/pkg/event/dispatcher.go
package event
internal/pkg/event/event.go
package event
internal/user/create.go
package user
internal/user/delete.go
package user
internal/user/update.go
package user

测试

2020/07/08 15:40:10 after create: {Time:2020-07-08 14:40:10.024471 +0000 UTC ID:111}