首页 > 解决方案 > 如何在 spring web-flux 中发送电子邮件响应式

问题描述

我想在我的新 spring 应用程序中保持完全的反应。因此,我将 web-flux/reactor 和 ReactiveRepository 与 MongoDB 一起使用。

您知道如何将 java-mail 响应式集成到技术堆栈中吗?有什么选择吗?

标签: spring-bootjakarta-mailspring-webfluxreactive-streams

解决方案


对于发送电子邮件并且仍然是非阻塞的,您可以在另一个线程中运行有关发送电子邮件的代码。如果您使用的是 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


推荐阅读