applicationPublish、eventListener实现java后端异步

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

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

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

    

 

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

 

 

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

 

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

 

                                图 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

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

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值