如何定时执行数据库查询操作(tomcat+spring)

1.spring配置文件(配置连接数据库相关信息,另bean:jdbcTemplate),代码如下: 

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		init-method="init" destroy-method="close">
		<property name="driverClassName" value="${druid.pool.driverClassName}" />

		<!-- 基本属性 url-user-password -->
		<property name="url" value="${druid.pool.url}" />
		<property name="username" value="${druid.pool.username}" />
		<property name="password" value="${druid.pool.password}" />

		<!-- 配置初始化大小-最小-最大 -->
		<property name="initialSize" value="${druid.pool.initialSize}" />
		<property name="minIdle" value="${druid.pool.minIdle}" />
		<property name="maxActive" value="${druid.pool.maxActive}" />

		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="${druid.pool.maxWait}" />

		<property name="testWhileIdle" value="${druid.pool.testWhileIdle}" />
		<property name="validationQuery" value="SELECT 'x'" />

		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="${druid.pool.timeBetweenEvictionRunsMillis}" />

		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="${druid.pool.minEvictableIdleTimeMillis}" />

		<!--
		<property name="passwordCallback">
			<bean class="com.cmcc.zysoft.spring.security.support.ProductionPasswordCallback" />
		</property>
		-->
	</bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>

   

2.线程类:该类继承Thread,用于定时执行查询。代码如下:

class OrderExceptionThread extends Thread {
	static Logger LOG = Logger.getLogger(OrderExceptionListener.class.getClass());  
	private JdbcTemplate jdbcTemplate;
	public OrderExceptionThread(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public void run() {
		while(true) {
		        // 每隔10min 将调用运单接口失败的订单 执行 一次 运单接口, 直至执行成功
			try {
				Thread.sleep(1000 * 60 * 10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			/*具体的查询代码*/
			/**
			 *
			 * ........
			 */   
		}
	}
	
}


3.Listener类:该类实现ServletContextListener,这样在服务器启动的时候,就会实例化该类;并且执行contextInitialized方法,获取spring中的bean:jdbcTemplate实例,在该方法内部,启动线程,定时执行查询。

代码如下:

public class OrderExceptionListener implements ServletContextListener {
	static Logger log4j = Logger.getLogger(OrderExceptionListener.class.getClass());  
	// 启动线程
	private OrderExceptionThread thread;
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
		JdbcTemplate jdbcTemplate = (JdbcTemplate) ac.getBean("jdbcTemplate"); 
		// 启动线程
		System.out.println("^^^^^^^^^^^^^^^^^^^^实例化线程^^^^^^^^^^^^^^^^^^");
		System.out.println(jdbcTemplate);
		thread = new OrderExceptionThread(jdbcTemplate);
		thread.start();
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		if (thread != null && thread.isInterrupted()) {
			System.out.println("******************");
			System.out.println("线程已经阻塞!");
			thread.interrupt();
		}
	}
	
}


4.web.xml:注册上述listener

<listener>
		<listener-class>com.cmcc.ict.individuation.listener.OrderExceptionListener</listener-class>
	</listener>


你可能感兴趣的:(如何定时执行数据库查询操作(tomcat+spring))