是时候更新我们的 REST API 了,让它成为一个事件驱动的应用程序。您会看到我们所做的更改并不难应用。我们将首先更新我们的依赖项,以便可以访问 Project Reactor 类。打开您的 API 应用程序 build.gradle 配置并扩展它:
在这里,我们介绍了对 Project Reactor 总线的支持。我们将使用它在某些特定情况下触发动作。如果系统中的 Notes 或 TODO 总数达到临界水平,我们将向系统管理员发送电子邮件。这个例子很简单。一个很好的例子是当存储达到大量已售商品时触发操作。另一个可能是未订阅用户的数量增加超过一定百分比,依此类推。
我们将定义一些简单的实体来表示通知。在 data 包下使用数据类成员 NotesCountNotification 创建一个名为 reactor 的包:
我们需要两个数据类的服务抽象。在reactor包下,创建成员接口NotificationService:
实体计数的注释和 TODO 通知服务接口如下所示:
- NotesCountNotificationService:
- TodosCountNotificationService:
对于每个主界面,我们必须有正确的实现。由于我们将发送电子邮件,因此我们必须添加 Spring 电子邮件依赖项。使用以下内容扩展 build.gradle 配置:
为了能够发送电子邮件,我们必须满足一些要求。我们必须准备好几个课程,以便可以发送电子邮件。我们将一个一个地创建它们,但首先创建一个名为 mail 的新包,然后创建第一个名为 MailMessage 的类:
我们定义了基本实体来表示我们将发送的消息。我们希望能够发送没有任何附件的电子邮件。为此,我们将创建一个接口来表示该功能,称为 EmailService:
实现应该如下所示(MailServiceImpl.kt):
正如您在前面的代码中看到的,我们定义了 Spring 组件并为 JavaMailSender 实现注入了一个依赖项:JavaMailSenderImpl。该类负责执行邮件发送操作。我们几乎可以发送电子邮件了。还有最后一件事要做。我们必须提供电子邮件服务器配置。从我们的配置 Git 存储库中打开 journaler.configuration 并提供参数,如下例所示:
在这里,您将输入您的真实 Gmail 地址以及您的用户名和密码,而不是我们在示例中提供的那些!
现在为 NotesCountNotificationService 创建实现。将类命名为 NotesCountNotificationServiceImpl 和以下实现:
我们还需要 TodosCountNotificationService 的实现:
该实现与 Note 实体执行相同的操作,方法是发送有关系统中实体计数的电子邮件消息。对于这两种实现,将 [email protected] 的 to 值替换为您想要的目标电子邮件地址。
为了能够将通知映射到 Project React 事件总线,我们必须定义消费者类。在 reactor 包中创建一个名为 NotificationConsumer 的新接口:
我们将有两个实现。第一个是 NotesCountNotificationConsumer:
第二个将如下所示:
最后,我们将更改我们的代码,以便我们能够传输事件。打开 NoteService 并更新其实现:
对 TodoService 类做同样的改变:
每次插入新实体时,我们都会检查计数,如果总计数大于 10,我们将传输事件。我们使用 EventBus 类来发送包装通知。由于我们仍然没有一个 EventBus 候选注入,我们必须提供一个。此外,在这里我们将把所有部分连接在一起,使我们的代码准备好执行。
打开 ApiApplication 应用程序类并扩展它:
我们刚刚做了什么?首先,我们使用以下代码扩展了 CommandLineRunner:
前面的接口用于指示 bean 在包含在 Spring 应用程序中时应该运行。多个 CommandLineRunner bean 可以在同一个应用程序上下文中定义,并且可以使用 Ordered 接口或 @Ordered 注释进行排序。
使用以下代码块,我们初始化 EventBus:
在这里,EventBus 使用环境中的默认线程池进行初始化。我们还映射了我们的消费者,现在我们准备好尝试我们的 REST API。启动你的本地 Redis 服务器,并一一运行所有服务:配置、发现、网关,最后是 Journaler API。从 Web 浏览器登录到您在配置中定义的 Gmail 帐户。打开 Postman 并插入一些笔记和 TODO。计数超过 10 项后,您应该会收到一封电子邮件。
可能是您在使用 Gmail SMTP 服务器时遇到问题,或者您根本无法访问 SMTP 服务器。在这种情况下,您需要更新您的实现以仅记录通知而不是尝试发送电子邮件。
打开 NotesCountNotificationServiceImpl 并更新它:
对 TodosCountNotificationServiceImpl 执行相同操作:
再次重新运行所有服务并重试。您会注意到类似于以下的日志输出: