我的微服務中有一個 get 函式,它本質上是從資料庫中獲取資料。此函式作為調度程式(cron 作業)運行,也作為可以從 UI 觸發的 api 端點運行。
@GetMapping(value = "getDataUI")
public String getDataUI() throws Exception {
return service.getData(); // call to service layer
}
//service layer
@Scheduled(cron = "0 0 8 * * ?")
public String getData(){
// logic here //
}
我想在 getData() 中添加一些邏輯,這些邏輯僅在由調度程式觸發時執行,并且在從 UI(“/getDataUI”)呼叫時應跳過該邏輯。
我怎樣才能做到這一點?還是有更好的方法來實作我正在嘗試做的事情?
uj5u.com熱心網友回復:
請注意,我們需要遵循以下簡單規則來注釋方法@Scheduled:
- 該方法通常應該有一個 void 回傳型別(如果沒有,回傳的值將被忽略)
- 該方法不應期望任何引數
解決方案 1. 創建兩個單獨的方法
把事情簡單化:
public class DataService implements Service {
public String getData() {
return "Data";
}
@Scheduled(cron = "0 0 8 * * ?")
public void performScheduler() {
/*scheduler logic*/
String data = getData();
/* process data */
}
}
解決方案 2. 為調度程式創建單獨的服務
public class SchedulerDataService {
private Service service;
public SchedulerDataService(Service service) {
this.service = service;
}
@Scheduled(cron = "0 0 8 * * ?")
public void performScheduler() {
/*scheduler logic*/
String data = service.getData();
/* process data */
}
}
uj5u.com熱心網友回復:
這可以通過以下方式實作
- 重構cron作業和服務方法
- Cron Job 可以有包裝方法來呼叫 Service 方法。
- 在服務方法中添加引數
在上面的例子中:
1.getDataUI同上
@GetMapping(value = "getDataUI")
public String getDataUI() throws Exception {
--
return service.getData("UI"); // call to service layer
}
從服務層中洗掉了計劃注釋
//服務層
public String getData(String param){ if(param=="CRON") // else // }計劃任務
@Scheduled(cron = "0 0 8 * * ?") public String getScheduleData(){ //service.getData("CRON"); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437306.html
