spring容器加载完成之后进行开启一个线程进行数据更新操作

需求:最近做项目遇到了一个需求,数据表中有些数据需要定时更新,这样就需要启动一个线程完成,不想再新建一个项目来完成这些事,就想在spring启动之后来开启一个线程定时来完成这件事 ,直接上代码

package com.irisian.picturelabel.listener;

import com.irisian.picturelabel.service.PictureService;
import com.irisian.picturelabel.service.TaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Author:吴满心
 * Date:2018/5/18
 * Function:负责在spring容器加载完成之后进行图片和任务数据表的更新
 */
@Component
public class SpringFinishedListener implements InitializingBean {
    private static final Logger logger = LoggerFactory.getLogger(SpringFinishedListener.class);

    @Autowired
    private PictureService pictureService;

    @Autowired
    private TaskService taskService;

    @Override
    public void afterPropertiesSet() throws Exception {
        new Thread(() -> {
            while (true) {
                logger.info("开始执行图片和任务的更新操作!");
                try {
                    pictureService.updatePictureStatus();
                    //更新任务的完成状态信息
                    taskService.updateFinishStatus();
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error(e.getMessage());
                }
                try {
                    Thread.sleep(1800000);      //30分钟执行一次进行数据更新
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    logger.error(e.getMessage());
                }
            }
        }).start();


    }
}

开始还尝试过servlet的方法,如

package com.irisian.picturelabel.servlet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

/**
 * Author:吴满心
 * Date:2018/5/18
 * Function:
 */
@WebServlet(name = "backServlet", urlPatterns = {"/backServlet"})
public class BackServlet extends HttpServlet {
    private static final Logger logger= LoggerFactory.getLogger(BackServlet.class);

    @Override
    public void init() throws ServletException {
        new Thread(()->{
            while(true){
                logger.info("我5秒钟执行一次");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    logger.error(e.getMessage());
                }
            }
        }).start();
    }


    @Override
    public void destroy() {
        logger.info("服务器关闭了");
    }
}

配置Configuration

package com.irisian.picturelabel.configuration;
import com.irisian.picturelabel.exception.MyExceptionResolver;
import com.irisian.picturelabel.servlet.BackServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;

/**
 * Author:吴满心
 * Date:2018/5/15
 * Function:
 */
@Configuration
public class SpringConfiguration {
    @Bean
    public HandlerExceptionResolver getHandlerExceptionResolver() {
        return new MyExceptionResolver();
    }

    /**
     * 配置一个后台运行的servlet
     *
@return
     
*/
    
@Bean
    public ServletRegistrationBean servletRegistrationBean() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new BackServlet(), "/backServlet");
        servletRegistrationBean.setLoadOnStartup(1);        //数字越小,启动优先级越高,但是必须大于0
        return servletRegistrationBean;
    }

}


但是不满足spring启动之后,spring不启动完成,就无法使用bean了,所以就按照前面的一种方法了


你可能感兴趣的:(java,web)