歡迎關注我的公眾號: Java編程技術樂園。分享技術,一起精進Quartz!
做一個積極的人
編碼、改bug、提升自己
我有一個樂園,面向編程,春暖花開!
當任何時候覺你得難受了,其實你的大腦是在進化,當任何時候你覺得輕鬆,其實都在使用以前的壞習慣。
通過前面的學習,你可能大致瞭解了Quartz,本篇博文為你打開學習SSMM+Quartz的旅程!歡迎上車,開始美好的旅程! 本篇是在SSM框架——Spring+SpringMVC+Mybatis的搭建教程這篇為基礎上進行的,如果不瞭解SSM搭建請先點擊閱讀!
一、環境介紹
工具:Eclipse+ Mysql
框架:Spring+SpringMVC+Mybatis
日誌:logback
構建工具:Maven
單元測試:Junit4
Quartz版本:2.2.1
二、SSMM+Quartz集成詳解
1、概述
在之前SSM框架的基礎集合Quartz寫一個簡單的Web項目,實現Quartz的動態添加,修改和刪除功能!(這裡只是對Cron類型的Trigger進行操作)
2、項目結構
3、初始化
在項目中找到初始化sql——quartz_test.sql ,導入自己的數據庫中!初始化的表信息如下:
qrtz_blob_triggers,
qrtz_calendars,
qrtz_fired_triggers,
qrtz_locks,
qrtz_paused_trigger_grps,
qrtz_scheduler_state,
qrtz_simple_triggers,
qrtz_simprop_triggers,
qrtz_triggers,
user_t
4、配置文件介紹
4.1 在ApplicationContext.xml中添加下面的配置:
<bean>
<property>
<property>
<property>
/<bean>
4.2 添加quartz.properties配置文件
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName: quartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore
#============================================================================
#default config
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
#持久化配置
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:true
#============================================================================
#havent cluster spring
#============================================================================
org.quartz.jobStore.isClustered = false
#數據庫表前綴
org.quartz.jobStore.tablePrefix:qrtz_
#org.quartz.jobStore.dataSource:qzDS
#============================================================================
# Configure Datasources
#============================================================================
#JDBC驅動 Sping去管理dataSource ,這裡不在配置數據源信息
#org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
#org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test
#org.quartz.dataSource.qzDS.user:root
#org.quartz.dataSource.qzDS.password:root
#org.quartz.dataSource.qzDS.maxConnection:10
5、關鍵代碼簡單介紹
5.1 過濾器
添加過濾器攔截請求,若用戶沒有登錄,則跳轉到登錄頁面!
a. 新增LoginFilter.java,核心代碼如下:
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
//判斷Session中是否有登錄用戶信息
String toke = (String) session.getAttribute(CommonConstant.LONGIN_TOKE);
if(!StringUtils.isEmpty(toke)){
chain.doFilter(req, resp);
}else{
//若沒有則,跳轉到登錄頁面
response.sendRedirect(request.getContextPath() + "/user/toLogin");
}
}
b.在web.xml配置過濾器:
<filter>
<filter-name>LoginFilter/<filter-name>
<filter-class>org.ssm.dufy.filter.LoginFilter/<filter-class>
/<filter>
<filter-mapping>
<filter-name>LoginFilter/<filter-name>
<url-pattern>//<url-pattern>
/<filter-mapping>
5.2BAO和Service接口
Dao主要是用戶的一些操作!
public interface IUserDao {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
User findUser(User user);
}
Service主要是對定時任務的一些操作!
package org.ssm.dufy.service;
public interface QuartzService {
/**
* addJob(方法描述:添加一個定時任務)
* (方法適用條件描述: – 可選)
*
* @param jobName
* 作業名稱
* @param jobGroupName
* 作業組名稱
* @param triggerName
* 觸發器名稱
* @param triggerGroupName
* 觸發器組名稱
* @param cls
* 定時任務的class
* @param cron
* 時間表達式 void
* @exception
* @since 1.0.0
*/
public void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class cls, String cron);
/**
*
* @param oldjobName 原job name
* @param oldjobGroup 原job group
* @param oldtriggerName 原 trigger name
* @param oldtriggerGroup 原 trigger group
* @param jobName
* @param jobGroup
* @param triggerName
* @param triggerGroup
* @param cron
*/
public boolean modifyJobTime(String oldjobName,String oldjobGroup, String oldtriggerName, String oldtriggerGroup, String jobName, String jobGroup,String triggerName, String triggerGroup, String cron);
/**
* 修改觸發器調度時間
* @param triggerName 觸發器名稱
* @param triggerGroupName 觸發器組名稱
* @param cron cron表達式
*/
public void modifyJobTime(String triggerName,
String triggerGroupName, String cron);
/**
* 暫停指定的任務
* @param jobName 任務名稱
* @param jobGroupName 任務組名稱
* @return
*/
public void pauseJob(String jobName,String jobGroupName);
/**
* 恢復指定的任務
* @param jobName 任務名稱
* @param jobGroupName 任務組名稱
* @return
*/
public void resumeJob(String jobName,String jobGroupName);
/**
* 刪除指定組任務
* @param jobName 作業名稱
* @param jobGroupName 作業組名稱
* @param triggerName 觸發器名稱
* @param triggerGroupName 觸發器組名稱
*/
public void removeJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName);
/**
* 開始所有定時任務。啟動調度器
*/
public void startSchedule();
/**
* 關閉調度器
*/
public void shutdownSchedule();
}
操作用戶通過Mybatis進行,操作定時器任務,使用的Quartz封裝好的接口!
主要的實現代碼就不在這裡展示!如需查看請看源碼!
5.3 Controller
(1):UserController
處理一些用戶的請求操作!
(2):QuartzController
處理Quartz的請求操作!
6、任務類
package org.ssm.dufy.job;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloWorldJob implements Job{
/**
* "0/5 * * * * ? 五秒運行一次
*/
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("----hello world---" + new Date());
}
}
7、待優化地方
- 界面的美觀性
- 可以添加Simple類型的Trigger
- 用戶信息的管理
- 抽象Job的Dao類 。。。。。。
三、運行效果介紹
有兩種方式啟動本實例項目: 1:Tomcat方式,Tomcat方式不在講解! 2:Jetty方式 在pom.xml中配置了Jetty的依賴的插件!
<plugin>
<groupid>org.apache.maven.plugins/<groupid>
<artifactid>maven-war-plugin/<artifactid>
<version>2.4/<version>
/<plugin>
<plugin>
<groupid>org.mortbay.jetty/<groupid>
<artifactid>jetty-maven-plugin/<artifactid>
<version>8.1.15.v20140411/<version>
<configuration>
<scanintervalseconds>10/<scanintervalseconds>
<stopport>9999/<stopport>
<reload>manual/<reload>
<webappconfig>
<contextpath>/ssm_quratz/<contextpath>
/<webappconfig>
<connectors>
<connector>
<port>8080/<port>
<maxidletime>60000/<maxidletime>
/<connector>
/<connectors>
/<configuration>
/<plugin>
在Eclipse運行步驟如在截圖:
配置的參數:
-server -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDetails -Xloggc:%M2_HOME%/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%M2_HOME%/java_pid.hproyuan
配置好之後運行啟動不報錯就ok!
最後打開瀏覽器,輸入 http://localhost:8080/ssm_quratz
運行結果圖 第一 :登錄頁面
第二:任務列表頁面
第四:Eclipse控制檯打印的信息
四、總結和源碼
從前面的系列學習過來,那本文就是一個簡單的實戰,根據實際的項目和一些簡單的案例進行講解,Quartz掌握到這裡,基本上企業級開發也能夠應付了,後續持續學習,精進Quartz的源碼!
如需要源碼:SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成
可以關注公眾號進行後臺留言可以獲取!
謝謝你的閱讀,如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你每天開心愉快!
不管做什麼,只要堅持下去就會看到不一樣!在路上,不卑不亢!
願你我在人生的路上能都變成最好的自己,能夠成為一個獨擋一面的人
© 每天都在變得更好的阿飛雲
閱讀更多 阿飛雲的技術樂園 的文章