Spring的定時任務(任務排程)兩種
Spring內部有一個task是Spring自帶的一個設定時間自動任務排程,提供了兩種方式進行配置,一種是註解的方式,而另外一種就是XML配置方式了。註解方式比較簡潔,XML配置方式相對而言有些繁瑣,但是應用場景的不同,兩者又各有優點,所以具體使用還是根據需求來劃分。因為任務排程這樣的需求,通常改動都是比較多的,如果用註解的方式改動就變得麻煩了,必須去重新編譯。所以更多的時候我選擇用XML配置的方式。
- XML配置方式
第一步:編寫作業類
@Service public class MiaoshaTask { @Autowired private RedisTemplate redisTemplate; @Autowired private RedissonClient redissonClient; public void removeExpireUser() throws InterruptedException { RLock rLock = redissonClient.getLock("lock_task"); //我沒有獲取鎖的情況下,0等待時間 //獲取到鎖的情況,最多5秒釋放時間 boolean f = rLock.tryLock(0, 5, TimeUnit.SECONDS); if (f) { System.out.println("獲取了鎖,執行刪除功能"); long t = System.currentTimeMillis() - 24 * 60 * 60 * 1000; redisTemplate.boundZSetOps("miaosha_users") .removeRangeByScore(0, t); Thread.sleep(4000); rLock.unlock(); } else { System.out.println("沒有獲取鎖,跳過了"); } } }
第二步:新增spring-task配置檔案(spring-task.xml),相關頭資訊如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"> <task:scheduled-tasks> <task:scheduled ref="miaoshaTask" method="removeExpireUser" cron="0/5 * * * * ?"/> </task:scheduled-tasks> </beans>
其中:ref引數指定任務類,method指定需要執行的方法
第三步:在spring配置檔案(applicationContext.xml)中引入spring-task配置檔案
<import resource="spring-task.xml"/><!-- 匯入spring-task.xml配置檔案 -->
完成!!!
- 使用註解形式
瞭解一下原始檔中@Scheduled註解的定義
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Scheduled { public abstract String cron(); public abstract long fixedDelay(); public abstract long fixedRate(); }
cron:指定cron表示式
fixedDelay:官方文件解釋:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示從上一個任務完成開始到下一個任務開始的間隔,單位是毫秒。
fixedRate:官方文件解釋:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即從上一個任務開始到下一個任務開始的間隔,單位是毫秒。
註解配置方式
第一步:編寫作業類
@Service
public class MiaoshaTask {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private RedissonClient redissonClient;
@Scheduled(cron = "0/5 * * * * ? ")
public void removeExpireUser() throws InterruptedException {
RLock rLock = redissonClient.getLock("lock_task");
boolean f = rLock.tryLock(0, 5, TimeUnit.SECONDS);
if (f) {
System.out.println("獲取了鎖,執行刪除功能");
long t = System.currentTimeMillis() - 24 * 60 * 60 * 1000;
redisTemplate.boundZSetOps("miaosha_users")
.removeRangeByScore(0, t);
Thread.sleep(4000);
rLock.unlock();
}
else
{
System.out.println("沒有獲取鎖,跳過了");
}
}
}
第二步:新增spring-task配置檔案(spring-task.xml),相關頭資訊如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<!-- 開啟定時服務 註解方式 -->
<task:annotation-driven />
</beans>
cronExpression的配置說明
欄位 允許值 允許的特殊字元
秒 0-59 , - * /
分 0-59 , - * /
小時 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可選) 留空, 1970-2099 , - * /
- 區間
* 萬用字元
? 你不想設定那個欄位
下面只例出幾個式子
CRON表示式 含義
"0 0 12 * * ?" 每天中午十二點觸發
"0 15 10 ? * *" 每天早上10:15觸發
"0 15 10 * * ?" 每天早上10:15觸發
"0 15 10 * * ? *" 每天早上10:15觸發
"0 15 10 * * ? 2005" 2005年的每天早上10:15觸發
"0 * 14 * * ?" 每天從下午2點開始到2點59分每分鐘一次觸發
"0 0/5 14 * * ?" 每天從下午2點開始到2:55分結束每5分鐘一次觸發
"0 0/5 14,18 * * ?" 每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發
"0 0-5 14 * * ?" 每天14:00至14:05每分鐘一次觸發
"0 10,44 14 ? 3 WED" 三月的每週三的14:10和14:44觸發
"0 15 10 ? * MON-FRI" 每個週一、週二、週三、週四、週五的10:15觸發