介绍:最近在项目中,需要在启动项目时启动一个线程进行业务操作,在网上查找资料后准备采取监听的实现方式。
1首先创建一个类MqMsgTransformationListener 集成ServletContextListener
代码:
package com.enter.net.quartz;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.enter.net.fhbusiness.monitor.service.MqMsgTransformationService;
import com.enter.net.frame.util.SpringUtils;
import com.enter.net.frame.util.log.LogUtil;
/**
* Listener的方式在后台执行一线程
*
* @author ll
*
*/
public class MqMsgTransformationListener implements ServletContextListener {
private MqMsgTransformationThread mqMsgTransformationThread;
public void contextDestroyed(ServletContextEvent e) {
if (mqMsgTransformationThread != null && mqMsgTransformationThread.isInterrupted()) {
mqMsgTransformationThread.interrupt();
}
}
public void contextInitialized(ServletContextEvent e) {
String str = null;
if (str == null && mqMsgTransformationThread == null) {
mqMsgTransformationThread = new MqMsgTransformationThread();
mqMsgTransformationThread.start(); // servlet 上下文初始化时启动 socket
}
}
}
2启用一个线程类 继承 Thread 需要重写run()方法 可以书写自己的业务逻辑
/**
* 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
*
* @author ll
*
*/
class MqMsgTransformationThread extends Thread {
private MqMsgTransformationService mqMsgTransformationService = (MqMsgTransformationService) SpringUtils.getBean("mqMsgTransformationService");
public void run() {
while (!this.isInterrupted()) {// 线程未中断执行循环
try {
mqMsgTransformationService.MqMsgTransformation();
Thread.sleep(2000); //每隔2000ms执行一次
} catch (InterruptedException e) {
LogUtil.error("线程出现错误"+e.getMessage(),e);
e.printStackTrace();
}
// ------------------ 开始执行 ---------------------------
System.out.println("开始执行____FUCK TIME:" + System.currentTimeMillis());
}
}
}
3 最后在web.xml 中增加监听器。
<listener>
<listener-class>com.enter.net.quartz.MqMsgTransformationListener</listener-class>
</listener>
这样就可以在项目启动时自动启动线程。
参考:https://blog.csdn.net/sunnylinner/article/details/52004745