spring-boot - 如何在 spring web-flux 中发送电子邮件响应式
问题描述
我想在我的新 spring 应用程序中保持完全的反应。因此,我将 web-flux/reactor 和 ReactiveRepository 与 MongoDB 一起使用。
您知道如何将 java-mail 响应式集成到技术堆栈中吗?有什么选择吗?
解决方案
对于发送电子邮件并且仍然是非阻塞的,您可以在另一个线程中运行有关发送电子邮件的代码。如果您使用的是 Spring WebFlux,则可以通过将用于发送电子邮件的代码包装在Mono(A Reactor library Publisher)的以下工厂方法中来轻松完成。
Mono.fromCallable()
或者
Mono.fromRunnable()
短代码
Mono.fromCallable(()-> sendEmail())
.subscribe();
sendEmail ()是您发送电子邮件的函数。
这也是文档中推荐的内容 -如何包装同步阻塞呼叫?
长代码
以下是我在我的应用程序中使用的完整示例代码 -
Mono.fromCallable(() -> {
try {
MimeMessageHelper helper = new MimeMessageHelper(sender.createMimeMessage());
helper.setTo(to);
helper.setSubject(subject);
helper.setText(body);
sender.send(helper.getMimeMessage());
log.info("Email send successfully, subject {} , to {}", subject, to);
return true;
} catch (Exception e) {
log.warn("Failed to send email with subject {}, due to {}",subject,e.getMessage(), e});
return false;
}
)
.subscribe(result -> log.info("Mail sent {}", result));
当它是响应式堆栈时,永远不要忘记订阅:D
推荐阅读
- mysql - 我正在使用带有 EXTRACTVALUE 命令的 MYSQL,当使用 [@attribute="value"] 过滤器时,以下查询返回 BLANK。为什么?
- c++ - 'operator' : 作为左操作数
- c# - 关于在 2d Platformer 项目的 C# 代码中使用 Get Accessor 而不是 if 语句的问题
- angular - Angular 8 hot/live reload 无法正常工作
- javascript - 从 CDN 包含引导程序时,类的自动完成在智能感知中不起作用
- c - 缓存是否有可能超过 100% 的未命中率
- github - 当另一个存储库创建新版本时触发 GitHub 操作
- c++ - 应该 C++ std::future
方法命名为 is_ready() 还是 ready()? - laravel - 如何以更新形式为 Laravel 检索图像数据库
- vue.js - How do I change the URL of the page in Nuxt SSR mode without reloading the whole page?