一、应用场景
需要程序启动后,不断地对一个接口访问
二、代码(xml版本)
web.xml
<!-- 自定义监听器 外呼接口回执 -->
<listener>
<listener-class>com.xxxx..listener.OutboundListener</listener-class>
</listener>
自定义的监听器
public class OutboundListener extends Thread implements ServletContextListener{
/**
* 服务启动执行
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("启动线程==========(执行外呼接口回执)==============");
//服务器动,开启一个线程
super.start();
}
/**
* 服务注销执行
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
//stop方法是不安全的, 停止线程会使它解锁它已锁定的所有监视器。
super.interrupt();
}
@Override
public void run() {
ScpService scpService = ScpClientImpl.getInstance();
while(true) {
//睡一会
try {
Thread.sleep(10000);
//业务代码
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
三、如果需要注入bean
此时ioc容器还没有初始化,无法从中依赖注入bean
启动方法中加
/**
* 服务启动执行
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
ServletContext application = arg0.getServletContext();
WebApplicationContext appctx = WebApplicationContextUtils.getWebApplicationContext(application);
this.guideToolService = appctx.getBean(GuideToolService.class);
//服务器动,开启一个线程
super.start();
}
web.xml中也需要加入
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
不加appctx 是null。
原理:服务器在启动时会读取Web.xml中的配置的监听,而ContextLoaderListener这个监听类的职责就是自动封装WebApplicationContext对象,由于没有配置该监听所有获取到对象是null