quartz

Quartz是一個徹底由java編寫的開源做業調度框架。不要讓做業調度這個術語嚇着你。儘管Quartz框架整合了許多額外功能, 但就其簡易形式看,你會發現它易用得簡直讓人受不了!。簡單地建立一個實現org.quartz.Job接口的java類。Job接口包含惟一的方法:
public void execute(JobExecutionContext context)
throws JobExecutionException;
在你的Job接口實現類裏面,添加一些邏輯到execute()方法。一旦你配置好Job實現類並設定好調度時間表,Quartz將密切注意剩餘時間。當調度程序肯定該是通知你的做業的時候,Quartz框架將調用你Job實現類(做業類)上的execute()方法並容許作它該作的事情。無需報告任何東西給調度器或調用任何特定的東西。僅僅執行任務和結束任務便可。若是配置你的做業在隨後再次被調用,Quartz框架將在恰當的時間再次調用它。

下面說一下quartz的簡單使用方法:我這裏使用的是maven管理jar  也能夠選擇其餘如gradle。java

導入有關quartz的包web

  <dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.3</version>
		</dependency>

  而後由於我工程中用的spring管理bean因此還須要導入spring的包spring

<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>

  spring的版本數據庫

<spring.version>4.2.4.RELEASE</spring.version>

  先介紹下我這裏用quartz作了什麼:  設置了一個定時器 天天零點時候觸發,從數據庫中查詢全部當天生日的用戶的郵箱,而後羣發祝福郵件。session

quartz爲何能作到。只是簡單的使用quartz的話,個人理解是這樣的。quartz讓用戶自定義 一個或者多個job ,一至多個trigger,job由使用者自定義內容,trigger用戶能夠選擇兩種觸發:SimpleTrigger,CronTrigger一般狀況下咱們選擇使用後者。mvc

若是您須要基於日曆的概念而不是按照SimpleTrigger的精確指定間隔進行從新啓動的做業啓動計劃。app

使用CronTrigger,您能夠指定號時間表,例如「每週五中午」或「每一個工做日和上午9:30」,甚至「每週一至週五上午9:00至10點之間每5分鐘」和1月份的星期五「。框架

即便如此,和SimpleTrigger同樣,CronTrigger有一個startTime,它指定什麼時候生效,以及一個(可選的)endTime,用於指定什麼時候中止計劃。maven

SimpleTrigger能夠知足的調度需求是:在具體的時間點執行一次,或者在具體的時間點執行,而且以指定的間隔重複執行若干次。好比,你有一個trigger,你能夠設置它在2015年1月13日的上午11:23:54準時觸發,或者在這個時間點觸發,而且每隔2秒觸發一次,一共重複5次。ide

下面介紹簡單用法,我是用spring管理因此在applicationContext中的配置:

    <!-- quartz  -->
    <bean id="sendWishJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <bean class="com.dabai.jobs.SendBirthdayWish"></bean>
        </property>
        <property name="targetMethod" value="sendWish"></property>
    </bean>
    <!-- quartz調度任務 triggrt-->
    <bean id="sendWishTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- jobDetail -->
        <property name="jobDetail" ref="sendWishJob"></property>
        <!-- 觸發時間 -->
        <property name="cronExpression">
            <value>0 0 0 1/1 * ? </value>
        </property>
    </bean>
    <!-- quartz調度工廠 -->
    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 注入觸發器trigger -->
        <property name="triggers">
            <list>
                <ref bean="sendWishTrigger"/>
            </list>
        </property>
    </bean>

這個是有關發送郵件使用的配置信息 如不須要的話能夠忽略

    <!-- 郵件配置 -->
    <context:property-placeholder location="classpath:mail.properties" />
    
    <!-- 郵件接口 -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${mail.smtp.host}"></property>
        <property name="username" value="${mail.smtp.username}"></property>
        <property name="password" value="${mail.smtp.password}"></property>
        <property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"></property>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
                <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
            </props>
        </property>
    </bean>

能夠看到  上述有關quartz的配置文件中包含三個內容 從上至下能夠這樣子理解:

1.一個調度  由一個trigger觸發 其中一個調度中能夠包含多個job,即執行多個任務指定job和其中的方法

2.一個trigger  指i明觸發條件和觸發的調度<value>0 0 0 1/1 * ? </value>這個表示每一個二十四小時 即一天執行 從零點開始,詳情能夠參考    cron表達式

3.quartz的trigger list 管理quartz全部觸發器的 一個list 說明能夠配置多個。

我這裏把job放在service層,由於在job中須要查數據庫 方便調用

下面是內容

package com.dabai.jobs;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;

import com.dabai.service.UserService;
import com.dabai.utils.MailSender;

/**  
* @author dabai: 

* 類說明  查找當日生日的用戶 發送生日祝福郵件類
*/
public class SendBirthdayWish {
    @Autowired
    private UserService userService;
    @Autowired
    private JavaMailSender javaMailSender;
    public void sendWish() throws AddressException{
        Calendar date=Calendar.getInstance();
        int month=date.get(Calendar.MONTH)+1;
        int day = date.get(Calendar.DAY_OF_MONTH);
        
        List<String>emails=userService.findBirthdayEmails(month,day);
        if(emails!=null&&emails.size()>0){
            String[]array=new String[emails.size()];
            List list=new ArrayList();
            InternetAddress[]address=null;
            for (int i=0;i<emails.size();i++) {
                array[i]=emails.get(i);
            }
            for(int i=0;i<array.length;i++){
                list.add(new InternetAddress(array[i]));
            }
            address=(InternetAddress[]) list.toArray(new InternetAddress[list.size()]);
            
            String msg="<h2> hi Dear</h2><br><b><pre>today is"+month+""+day+"日  and it's your birthday!  happy birthday to you </pre></b>";
            String subject="祝你生日快樂";
            MailSender mailsender=new MailSender();
            mailsender.sendWish(msg, subject, address, javaMailSender);
        }else{
            System.out.println("today nobody birthday"+new Date().toString());
        }
        
        
    }

}

下面是dao層的查詢代碼,我這裏是hibernate 

    @Override
    public List<String> findBirthdayEmails(final int month, final int day) {
        return  getHibernateTemplate().execute(new HibernateCallback<List<String>>() {

            @Override
            public List<String> doInHibernate(Session session) throws HibernateException {
                String hql="select u.email from User u where MONTH(u.birthday)=? and DAY(u.birthday)=?";
                Query query = session.createQuery(hql);
                query.setInteger(0, month);
                query.setInteger(1,day);
                List list = query.list();
                if(list!=null&&list.size()>0){
                    return list;
                }
                return null;
            }
        });
        
    }
相關文章
相關標籤/搜索