applicationPublish、eventListener实现java后端异步

  话不多少,直接实战——用法,想懂理论的自行百度~

1.主要用了spring的发布消息、监听事件机制。

          applicationEventPublisher发布事件→EventListener监听事件→执行异步操作。如图:

     applicationPublish、eventListener实现java后端异步_第1张图片

 

                                                               图1  applicationEventPublisher(注:spring4.2以后的版本才能发布object类型,之前的只能发布ApplicationEvent)

 

 

applicationPublish、eventListener实现java后端异步_第2张图片

                                                  图2   构建一个Event,它只是一个普通的java类 (event类主要用于传参)

 

applicationPublish、eventListener实现java后端异步_第3张图片

                                             图3  利用注入的  ApplicationEventPublisher  把Event发布出去,监听器就能监听到该event并执行监听器

 

applicationPublish、eventListener实现java后端异步_第4张图片

                                图 4  监听器

 

               如图: 1.首先它是一个spring组件

                           2.必须声明它是异步的

                           3.声明它是一个监听器

                           4.方法中传递的参数表明它是监听哪个事件

                           5.从监听事件中取参                  

         

 

 

 

整体逻辑是:

                  主程序把事件发布出去,主程序就继续执行(保存用户注册信息到数据库),监听器监听到该事件就会执行监听器里的代码,两者同时进行比如监听器里执行的是访问某个服务(根据手机号查询归属地,然后更新到用户信息表里),这样用监听器实现异步的好处是:不必等查询归属地结束再保存用户信息,而且无论什么查询手机归属地更新用户信息是否成功,都不会影响 主程序保存用户信息。

主要是面向服务架构,很多逻辑都是需要访问不同的服务。

------------------------------------------------------------------------

后来发现ApplicationListener中的代码会执行两边

------------------------------------------------------------------------

1.原因:定位到问题是ApplicationListener中的代码执行了两遍,于是百度,说是项目同时集成spring和springmvc会创建两个容器,故会执行两次。

2.解决办法不要注入context

@Autowired
private ApplicationContext context;

 用下面方法获取context

ContextLoader.getCurrentWebApplicationContext().publishEvent()

参考连接 :https://mahl1990.iteye.com/blog/2403911

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(java基础)