今天在做一个小项目时,使用了spring,但是在项目启动过程中,一直会把我的一个监听启动2次,这个监听实现了2个接口,其中一个是spring的ApplicatinListener
@Component
public class BlackManagerInitListener implements ServletContextListener,
ApplicationListener<ContextRefreshedEvent> {
private static Logger logger = Logger
.getLogger(BlackManagerInitListener.class);
private static volatile boolean bThreadStarted;
@Autowired
private BlacklistDao dao;
@Override
public void contextInitialized(ServletContextEvent event) {
logger.info("加载配置信息:开始......");
String realPath = event.getServletContext().getRealPath("/");
ConfigUtils.setPath(realPath);
logger.info("加载配置信息:完成......");
ConfigUtils.addOrUpdateBlicklist(Constant.OPENBLACKLIST_KEY, Constant.OPENBLACKLIST_VALUE, null);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//启动 处理线程
if (!bThreadStarted) {
bThreadStarted = true;
List<BlacklistFilterKey> list = dao.queryFilterKey();
StringBuffer value = new StringBuffer();
String realValue = null;
for (BlacklistFilterKey blacklistFilterKey : list) {
value.append(blacklistFilterKey.getKeyName()).append(":").append(blacklistFilterKey.getStatus()).append("|");
}
if(value.length()>0){
realValue = value.substring(0, value.length()-1);
}
ConfigUtils.addOrUpdateBlicklist(Constant.BLICKLIST_FILTERKEY, realValue, null);
BlicklistThread thread = new BlicklistThread(dao);
thread.start();
}
}
}
然后在web.xml中,我配置了2个不同的监听
<!-- 初始化监听器 -->
<listener>
<listener-class>com.shijie99.blacklistManager.listener.BlackManagerInitListener</listener-class>
</listener>
<!-- spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
原本以为没有问题,但是经过多次的测试后,发现在启动spring的监听时,它会去搜索是否有实现过它的监听,如果实现了的话,就会再次加载该监听,所以导致了2次监听的重复启动,
解决办法就是只启动自己的监听,而不去启动spring的监听,而spring的配置修改为:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>