首先说下思路

定时任务→避免重复提交数据

先从数据库里查询dateTime(日期或者时间),通过查询到的dateTime日期时间和系统时间(new Date())做比较

如果库里的日期小于现在的系统日期则同步数据,否则不同步。当开启这个业务时则每天自动同步一次数据。

这里涉及到俩点

1.比较时间   before方法-- Date类的一个方法,如果a早于b返回true,否则返回false

2.每天自动同步数据--可以使用线程池后面会说到

1.比较时间eg:

Date date=new Date();    
		 System.out.println(date);
		 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); 
		 String beginDate=sdf.format(date);
		 String newDate="2018-03-21";
		 String endDate="2018-03-19";
		  Date bt1=sdf.parse(beginDate); 
		  Date bt=sdf.parse(newDate); 
		  Date et=sdf.parse(endDate); 
		  if(et.before(bt)) {
			  System.out.println("1");
		  }else {
			  System.out.println("2");
		  }



2.每天自动同步数据

一.普通Thread 

eg:

/**  
 * 普通thread  
 * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,  
 * 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:  
 * @author YGC  
 *  
 */    
public class Task1 {    
    public static void main(String[] args) {    
        // run in a second    
        final long timeInterval = 1000;    
        Runnable runnable = new Runnable() {    
            public void run() {    
                while (true) {    
                    // ------- code for task to run    
                    System.out.println("Hello !!");    
                    // ------- ends here    
                    try {    
                        Thread.sleep(timeInterval);    
                    } catch (InterruptedException e) {    
                        e.printStackTrace();    
                    }    
                }    
            }    
        };    
        Thread thread = new Thread(runnable);    
        thread.start();    
    }    
}
二.线程池
eg:Java可以用java.util.concurrent.ScheduledExecutorService 来实现定时任务


import java.util.concurrent.Executors;    
import java.util.concurrent.ScheduledExecutorService;    
import java.util.concurrent.TimeUnit;    
    
/**  
 *   
 *   
 * ScheduledExecutorService是从Java SE5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。   
 * 相比于上两个方法,它有以下好处:  
 * 1>相比于Timer的单线程,它是通过线程池的方式来执行任务的   
 * 2>可以很灵活的去设定第一次执行任务delay时间  
 * 3>提供了良好的约定,以便设定执行的时间间隔  
 *   
 * 下面是实现代码,我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间。  
 *   
 *   
 * @author YGC  
 *   
 */    
public class Task3 {    
    public static void main(String[] args) {    
        Runnable runnable = new Runnable() {    
            public void run() {    
                // task to run goes here    
                System.out.println("Hello !!");    
            }    
        };    
        ScheduledExecutorService service = Executors    
                .newSingleThreadScheduledExecutor();    
        // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间    
        service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS);    
    }    
}


第三种spring quartz来做定时任务

eg: ApplicationContext.xml 配置

<!-- 定时任务 -->
<bean id="EventNotificationTimedTaskDao" class="cn.secure.dao.EventNotificationTimedTaskDao">
		<property name="jdbcTemplate" ref="jdbcTemplate" />
	</bean>
	<bean id="EventNotificationTimedTaskService" class="cn.secure.service.impl.EventNotificationTimedTaskServiceImpl">
		<property name="EventNotificationTimedTaskDao" ref="EventNotificationTimedTaskDao" />
	</bean>
	
	<bean id="myTask" class="cn.secure.web.front.EventNotificationTimedTaskController">
		<property name="EventNotificationTimedTaskService" ref="EventNotificationTimedTaskService" />
	</bean>
			
	<bean id="upgradeJobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">	
		     <property name="targetObject">
                <ref bean="myTask"/>
            </property>
            <!-- 调用类中的方法 -->
            <property name="targetMethod">
                <value>addHttpNowData</value>
            </property>
		<property name="concurrent" value="false" />

	</bean>
	<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		 	<property name="jobDetail">
                <ref bean="upgradeJobDetail1"/>
            </property>
            <!-- cron表达式 -->
            <property name="cronExpression">
                <value>0/2 * * ? * *</value>
            </property>
	</bean>				

		<!-- 线程执行器配置,用于任务注册 -->
	<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
		<property name="corePoolSize" value="50" />
		<property name="maxPoolSize" value="100" />
		<property name="queueCapacity" value="500" />

	</bean>
	
    <!-- 设置调度 开启定时任务 -->
	<bean id="startQuertz"   lazy-init="false"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">	 

		<property name="triggers">
			<list>	
			     <ref bean="doTime"  />		
			</list>
		</property>
		
		<property name="taskExecutor" ref="executor" />
	<property name="autoStartup" value="true" />
	</bean>

TimedTaskController ↓

public EventNotificationTimedTaskService getEventNotificationTimedTaskService() {
		return eventNotificationTimedTaskService;
	}
	public void setEventNotificationTimedTaskService(EventNotificationTimedTaskService eventNotificationTimedTaskService) {
		this.eventNotificationTimedTaskService = eventNotificationTimedTaskService;
	}
	
	public void addHttpNowData()  { 
			// 从接口获取数据
		try {
			this.eventNotificationTimedTaskService.addHttpNoticeData();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	 }