xxl-job是乙個分布式任務排程平台,其核心設計目標是開發迅速、學習簡單、輕量級、易擴充套件、開箱即用。我部門大部分定時任務排程都是基於xxl-job,諸如報表統計、定時資料同步等。
今天的素材**於某天產品經理想在定時同步報表資料的基礎上,再增加乙個手動觸發報表資料同步的功能。即在報表頁面上新增乙個手動同步的按鈕,觸發該按鈕就可以執行報表資料同步
1、保留定時同步功能,同時新增手動同步
2、手動同步的資料產生的效果要和定時資料同步的產生效果一樣
1、方案其實就是把寫在xxl-job執行器裡面的同步邏輯,再放到controller執行一遍一、新建乙個手動呼叫的controller,controller觸發資料同步邏輯service
2、方案在原先的定時器場景,我們為了避免定時器裡面的同步邏輯還沒完成,下次定時器就觸發導致資料同步不準確,我們在執行器裡面做一些手段進行規避,比如設定同步完成標誌位等。二、新建乙個手動呼叫的controller,在controller裡面直接觸發xxl-job執行器
如果基於方案一,方案看似可行,其實存在潛在的坑點。即定時器執行的時候,手動剛好觸發執行,或者反過來,手動觸發的時候,定時器也執行了。這樣就會導致資料同步執行多次,導致資料不準確。
後面我們調研了xxl-job,看到了xxl-job有提供restful風格觸發執行器的功能,這個功能簡直就是為我們量身定做,當手動呼叫的時候,觸發執行器,因為執行的是執行器裡面的呼叫邏輯,因此就會觸發我們為避免資料同步不準確所採取的手段
其具體介紹可以檢視官網,其鏈結如下
執行器 restful api
本例的核心**塊
@restcontroller
@api(tags = "xxl-job restful排程")
@profile("job")
@slf4j
public class xxljobcontroller ,accesstoken:{}", adminclientaddressurl,accesstoken);
executorbiz executorbiz = new executorbizclient(adminclientaddressurl, accesstoken);
returntretval = executorbiz.run(gettriggerparam());
log.info("retval:{}", json.tojsonstring(retval));
// 200 表示正常、其他失敗
if(retval.getcode() == 200)
return ajaxresult.error(retval.getmsg(),retval.getcode());
}private triggerparam gettriggerparam()
}
注:**中的demojobhandler,就是執行器裡面的排程方法。形如下
/**
* 1、簡單任務示例(bean模式)
*/@xxljob("demojobhandler")
public returntdemojobhandler(string param) throws exception
如果選用方案一,也不是不行,就還得做一些改造,比如增加全域性標誌位,而且在設定標誌位的時候,還要考慮併發場景下,可能出現的問題。因此還不如直接採用方案二。方案的選擇一定得要基於業務場景進行考量,不基於業務場景,談技術方案,很容易採坑 通過rpm方式手動公升級linux的ssh版本
安裝telnet並開啟 防止ssh公升級失敗後無法連線伺服器,可通過telnet方式連線伺服器預設埠是23 rpm ivh xinetd 2.3.14 39.el6 4.x86 64.rpm rpm ivh telnet server 0.17 47.el6 3.1.x86 64.rpm servi...
如何判斷檔案的編碼方式
最近做東西需要知道檔案 txt,html.究竟是什麼編碼方式,不然讀取檔案內容可能出現亂碼 經過網上查詢發現兩種總結一下,方便自己也方便別人 通過判斷檔案頭,不過檔案頭不是必須的,所以有些檔案是沒有檔案頭的 ef bb bf utf 8 fe ff utf 16 ucs 2,little endia...
Oracle通過觸發器和序列的方式實現自增
觸發器格式 create or replace trigger 觸發器名字 before insert on 資料表名字 for each row declare nextid number begin if new.自增的列名 is null or new.自增的列名 0 then select ...