1.需求分析
本次的需求是在springboot里发布dubbo rest 服务,用到了dubbox ,dubbox需要在web.xml里配置2个监听器,一个是spring的监听器,一个是dubbox的监听器。先介绍一下dubbox,dubbox是当当的一个开源框架,实现了dubbo,rest服务,详细配置可以看一下dubbox的官方文档,也可以百度一下用法。
官方文档:https://github.com/dangdangdotcom/dubbox
我们先不采用springboot的方式启动,建一个web工程,然后不用web.xml配置,demo结构如下
![](https://img.haomeiwen.com/i14026161/56c532fd7ea514d2.png)
2.功能实现
1.在MyContextLoaderListener实现ServletContextListener,这是自定义监听器,用来实现spring的初始化,功能和ContextLoadListenter一样
2.在TestConfiguration配置rest服务的一些相关信息,dubbo的配置信息等
3.在TestWebAppInitializer实现WebApplicationInitializer,实现web容器的初始化,在这里定义监听器的执行顺序,由于必须要实现BootstrapListenter在ContextLoadListenter之前执行,所以在第一步用了一个自定义的监听器,将context的初始化放到自定义的监听器中,如果不自定义监听器,就会产生先执行ContextLoadLisenter,后执行BootstrapListener,然后就会报错,未配置BootstrapListener,
![](https://img.haomeiwen.com/i14026161/1c627b708c50e9b6.png)
3.server采用的是servlet,所以在这里再配置一个servlet,
![](https://img.haomeiwen.com/i14026161/d7e9e08acafd2b3b.png)
4.经过这样的处理之后,就可以保证BootstrapListenter先于ContextLoadLisenter执行,然后就不会报错,测试可以通过rest方式访问。目前这是一个web工程,用的tomcat启动,下面放到springboot中启动。
3.springboot中发布dubbo rest服务
1.此问题的核心是解决BootstrapListenter和ContextLoadLisenter加载顺序问题,在springboot中,context需要在springboot的启动类中加载,所以没法自定义监听器,然后在定义2个监听器执行顺序,所以进入BootstrapListenter的内部,将初始化方法单独提出来放在context初始化之前,然后再添加一遍BootstrapListenter,保证销毁方法的执行。此方法可能有点简陋,暂时没想到别的更好的方法。
![](https://img.haomeiwen.com/i14026161/411f69d707dd43eb.png)
4.总结
dubbox官方文档中在web.xml中配置的监听器加载,但是实际需求中并没有web.xml。所以需要自己来在代码中加载监听器。产生问题的主要原因是2个监听器的加载顺序问题。一开始直接添加2个监听器
servletCxt.addListener(BootstrapListener.class);
//servletCxt.addListener(MyContextLoaderListener.class);
servletCxt.addListener(ContextLoaderListener.class);
这样会先跳过BootstrapListener,先执行ContextLoaderListener,所以自定义了一个监听器,然后就能按顺序执行。
网友评论