flask-mail异步发送邮件_Spring boot 异步事件编程详解

简介

本文章详细介绍Spring Boot中如何利用Event 事件机制,编程实现异步 处理一些比较耗时间的操作。

预习知识

您需要熟悉Spring boot项目开发;

您需要了解lombok的简单使用;

项目目录结构

3294c899886bde974cbeb2554c7eacad.png

config 目录下面,存放了一个异步事件的配置,代码看下面

controller 下面是web api的相关源代码

event.listener目录下面,是异步执行器,用于监听事件publish, 然后执行任务

event.vo 下面是事件Message结构体, 用于承载消息结构, 它会被New 创建实体,并赋值。 由Publisher发布事件,由Listener监听事件,解析有用的信息。

开始

您可以新建一个项目,采用spring boot 1.x或者2.x 都是可以的,下图以IDEA 开发工具为例,新建项目,选择Spring Intializr

bd7d2767aed841853395ac78ab494b63.png

web项目开发,需要选择Spring web组件

2e025580cafe65d327426960108b6dbf.png

创建项目之后,可以按照上面的目录结构,存放源代码

srcmainjavacometrobyeventsugarconfigAsynchronousSpringEventsConfig.java

先看异步事件配置文件

package com.netroby.eventsugar.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.event.ApplicationEventMulticaster;import org.springframework.context.event.SimpleApplicationEventMulticaster;import org.springframework.core.task.SimpleAsyncTaskExecutor;@Configurationpublic class AsynchronousSpringEventsConfig {    @Bean(name = "applicationEventMulticaster")    public ApplicationEventMulticaster simpleApplicationEventMulticaster() {        SimpleApplicationEventMulticaster eventMulticaster =                new SimpleApplicationEventMulticaster();        eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());        return eventMulticaster;    }}

源代码定义了一个独立的Configuration, 在Spring boot启动的时候,会被自动加载,定义的applicationEventMulticaster是描述了事件协调器(caster)的工作模式,这里定义的是一个多播(可以被多重消费的事件)

然后设置执行器 为一个简单的异步执行器(它会在后台异步执行,无阻塞)

异步执行器,前端用户访问接口的时候,是没有感知的,执行时,是后台执行。

然后我们看 srcmainjavacometrobyeventsugarcontrollerHelloController.java

package com.netroby.eventsugar.controller;import com.netroby.eventsugar.event.vo.MovieSubscribeEventVo;import org.springframework.context.ApplicationEventPublisher;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestControllerpublic class HelloController {    @Resource    private ApplicationEventPublisher eventPublisher;    @GetMapping("/")    public String homeAction() {        MovieSubscribeEventVo ev = new MovieSubscribeEventVo();        ev.setId("7789");        ev.setName("八百");        eventPublisher.publishEvent(ev);        return "hello";    }}

控制器引用了一个ApplicationEventPublisher, 它是事件的广播发布组件,利用PublishEvent方法,把我们定义的消息,可以发送出去,系统内进行多播广播。

消息里面有一个Id, 一个Name

我们看下消息体的定义: srcmainjavacometrobyeventsugareventvoMovieSubscribeEventVo.java

package com.netroby.eventsugar.event.vo;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class MovieSubscribeEventVo {    String id;    String name;}

接下来看一下事件监听组件 srcmainjavacometrobyeventsugareventlistenerMovieSubscribeEventListener.java

package com.netroby.eventsugar.event.listener;import com.netroby.eventsugar.event.vo.MovieSubscribeEventVo;import lombok.extern.slf4j.Slf4j;import org.springframework.context.event.EventListener;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Component;@Component@Slf4jpublic class MovieSubscribeEventListener {    @Async    @EventListener    public void handleEvent(MovieSubscribeEventVo event) {        String currentMethod = "handleEvent@MovieSubscribeEventListener";        log.info(currentMethod + " event: {}", event.toString());    }}

监听器设置了@Component 注解,所以项目启动时候,会被加载,handleEvent方法有两个注解,一个@Async, 一个@EventListener, 表示异步,以及它是一个时间监听器方法

方法有一个参数, 注意类型,MovieSubscribeEventVo, 表示它监听的是这样一个类型的消息体,只要系统广播中的消息,匹配到这个类型,就会触发这个方法

那么这个example示例里面,我们只是简单打印了log,其实你可以把它换成你想要的方法,比如发一个邮件通知,写一些信息到数据库等。

执行的结果

2020-10-28 08:47:10.814  INFO 6460 --- [TaskExecutor-12] c.n.e.e.l.MovieSubscribeEventListener    : handleEvent@MovieSubscribeEventListener event: MovieSubscribeEventVo(id=7789, name=八百)

这个异步的消息通知,被监听到了,消息传递来的数据, id为7789, name 为八百,刚好是我们publisher发送的消息

总结

以上本文,就是如何在Spring boot中进行异步消息Event通知的开发,只要你了解了这些基本概念,接下来,你就可以干大事业了。

喜欢的话,可以关注一下,更多精彩,等你来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值