下面說一下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; } }); }