使用线程实现执行方法不影响Tomcat的正常启动。
web.xml:
<!-- 配置tomcat 初始化数据 -->
<servlet>
<servlet-name>event-collector</servlet-name>
<servlet-class>com.hanshow.wise.base.delivery.servlet.NucleonEventProcessor</servlet-class>
<!-- 项目启动的顺序,在多个项目中执行方法依赖其他模块,配置变大点 -->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>event-collector</servlet-name>
<url-pattern>/event-collect</url-pattern>
</servlet-mapping>
Java实现:
package com.hanshow.wise.base.goods.servlet;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* Tomcat启动执行方法
* @author ZHJ
* @date 2018年9月18日
* @since 1.0.0
*/
@Component("processor")
public class NucleonEventProcessor extends HttpServlet {
Logger logger = LoggerFactory.getLogger(NucleonEventProcessor.class);
private static final long serialVersionUID = -9045451275234606838L;
// Servlet的init方法会在Tomcat启动的时候执行
@Override
public void init() throws ServletException {
FutureTask<String> task = new FutureTask<String>(new Callable<String>(){
@Override
public String call() throws Exception {
start(); // 使用另一个线程来执行该方法,会避免占用Tomcat的启动时间
return "Collection Completed";
}
});
new Thread(task).start();
}
private void start() {// 希望Tomcat启动结束后执行的方法
try{
Object sigLock = new Object();
synchronized (sigLock) {
// 调用的执行方法
new StaticCategory();
}
}catch(Exception e){
System.out.println(e);
}
}
}