Spring定时器

配置spring定时器步骤:

1.搭建spring环境,同时需要quartz.jar的支持

2. 编写applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>



<!--

    - Application context definition for JPetStore's business layer.

    - Contains bean references to the transaction manager and to the DAOs in

    - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").

-->

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="

            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <!-- 处理定时业务javaBean-->

    <bean id="quartjob" class="com.espeed.timer.ClickEmailSynTimer" ></bean>



    <!--Spring提供的类-- 提供2个属性-->

    <bean id="objAndmethod"

    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

        <!--目标类(定时器启动后操作的类,timerMethod是方法名-->

        <property name="targetObject" ref="quartjob" />  

        <property name="targetMethod" value="timerMethod" />

        

    </bean>

    

    <!--配置的时间-->

    <bean id="dotime" class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail">

            <ref bean="objAndmethod" />

        </property>

        <property name="cronExpression">

            <!--这里表示每1分钟启动1次,更多时间设置,查询cronExpression表达式—>

            <value>0 0/1 * * * ?</value>

        </property>

    </bean>



    <!-- 启动定时器-->

    <bean id="startQuartz" lazy-init="false" autowire="no"

        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

        <property name="triggers" >

            <list>

                <ref bean="dotime"/>

            </list>

        </property>

    </bean>

    

    <!--  -->

    <bean id="updatetime" class="com.espeed.timer.InitTimerTask">

        <property name="scheduler" ref="startQuartz" />

    </bean>

    

</beans>

3. 编写的InitTimerTask类(用于使spring 配置文件中修改的时间生效)

import org.quartz.Scheduler;

import org.springframework.scheduling.quartz.CronTriggerBean;



public class InitTimerTask {

    

    private static Scheduler scheduler;

    

    public void setScheduler(Scheduler scheduler){

        InitTimerTask.scheduler = scheduler;

    }

    

    //用于修改默认的时间设定,仅仅在配置文件中进行 修改是不行的,必须提供此入口.

    public static void updateTime(String expression)

    {

        try {

            /*

             * 通过Scheduler.getTrigger("truggerName","GroupName")得到CronTriggerBean

             * 通过setCronExpression方法设置时间

             * */

            CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("dotime", Scheduler.DEFAULT_GROUP);   

            

            if(! trigger.getCronExpression().equalsIgnoreCase(expression)){



                trigger.setCronExpression(expression);

                scheduler.rescheduleJob("dotime", Scheduler.DEFAULT_GROUP, trigger);



            } 

            //trigger.setCronExpression(expression);

            System.out.println(trigger.getName() + ":"+ trigger.getCronExpression());



        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

4. 编写定时器类ClickEmailSynTimer.java

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.espeed.dao.ISysCompanyDao;

import com.espeed.dao.impl.SysCompanyDaoImpl;

import com.espeed.mail.util.getArea;

import com.espeed.util.DBUtil;

import com.espeed.util.IpLocationTool;

import com.espeed.util.MakeJsonObject;



import net.sf.json.JSONArray;

import net.sf.json.JSONObject;



public class ClickEmailSynTimer 

{

    private Connection conn;

    private ResultSet rs;

    private PreparedStatement pst;

    private ISysCompanyDao dao;

    private String grantDomain;

    private CallableStatement cs;

    public void timerMethod() throws SQLException

    {

        //step1: 查询远程未同步的数据

        System.out.println("*********开始查询远程点读日志*********");

        dao = new SysCompanyDaoImpl();

        org.json.simple.JSONObject obj2 = dao.findCompanyGrant();

        grantDomain = obj2.get("domain_list").toString();

    

        conn = TimerTaskUtil.getConnection();

        pst = conn.prepareStatement("SELECT * FROM tb_singreadinfo WHERE mail_company_domain =?  AND mail_has_syn = -1");

        pst.setString(1, grantDomain);

        rs = pst.executeQuery();

        JSONArray datas = MakeJsonObject.makeArray(rs);

        

        TimerTaskUtil.close(rs, pst, conn);

        if(conn!=null)

        {

            conn.close();

        }

        //step2.将未同步的日志数据插入到本地数据库

        System.out.println("***********将未同步的日志数据插入到本地数据库************");

        conn = DBUtil.getConnection(); 

        

        String sql ="";

        int batchsize=0;

        for(int i=0;i<datas.size();i++)

        {

            sql = "INSERT INTO eml_mail_click_log( mail_id, mail_uid, link_id, click_time, view_ip ) VALUES (?,?,?,?,?)";

            pst = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

            

            JSONObject obj = datas.getJSONObject(i);

            System.out.println(obj.toString());

            pst.setInt(1, Integer.parseInt(obj.getString("mail_id")));

            pst.setString(2,obj.getString("mail_uid") );

            pst.setInt(3,1 );

            pst.setString(4,obj.getString("mail_readDate"));

            pst.setString(5, obj.getString("mail_readIp"));

            

            pst.executeUpdate();

        }

        

        DBUtil.close(rs, pst, conn);

        System.out.println("*****start update********");

        

        

        

        //step3.更新发送结果表中的点击归属地

        conn = DBUtil.getConnection();

        System.out.println("**********开始更新数据IP库************");

        sql = "update eml_mail_click_log set view_zone= ? where mail_id= ?";

        String zone="";

        for(int i=0;i<datas.size();i++)

        {

            pst = conn.prepareStatement(sql);

            zone = IpLocationTool.getCity(datas.getJSONObject(i).getString("mail_readIp"));

            

            //本地查找不到地址,查询远程.

            if(zone.equals("")||zone==""||zone==null)

            {

                zone = getArea.getArea(datas.getJSONObject(i).getString("mail_readIp"));

            }

            pst.setString(1, zone);

            pst.setInt(2,datas.getJSONObject(i).getInt("mail_id"));

            pst.executeUpdate();

        }

        

        

        //step4. 执行存储过程,计算发送结果

        System.out.println("**************** 执行存储过程,计算发送结果********************");

        conn = DBUtil.getConnection();

        cs = conn.prepareCall("{call sp_eml_click_result()}");

        cs.executeUpdate();

        

        DBUtil.close(rs, pst, conn);

        

        

        //step5.  更新远程数据库中是否同步字段为已经同步 1:已同步      -1:未同步

        conn = TimerTaskUtil.getConnection();



        sql = " update tb_singreadinfo set mail_has_syn = 1 where  " +

        " mail_company_domain = ? and sing_cid= ? ";

        int flag = 0;

        for(int i=0;i<datas.size();i++)

        {    

            pst = conn.prepareStatement(sql);

            pst.setString(1, grantDomain);

            pst.setInt(2,datas.getJSONObject(i).getInt("sing_cid") );

            pst.executeUpdate();

        }

        

        TimerTaskUtil.close(rs, pst, conn);

        

    }

    

}
5.完成,启动项目或者加载spring配置文件,即可生效.

你可能感兴趣的:(spring)