一個簡單的定時通知回撥執行緒實現
阿新 • • 發佈:2019-02-04
在日常的工作中,遇到如下的業務場景,類似於微信或者支付寶支付後定時通知呼叫方,每隔15/15/30/60...秒都要執行一次通知,於是自己實現瞭如下的程式碼。
通知執行緒是一個定時的執行緒,並且與主業務執行緒分離。
寫一個main方法進行測試public class AppCallBackTask implements Runnable { //業務屬性 private ScheduledExecutorService executorService; static final Log log = LogFactory.getLog(AppCallBackTask.class); final AtomicInteger count = new AtomicInteger(0); public AppCallBackTask() { } //業務構造方法 @Override public void run() { AppCallBackResponse res = new AppCallBackResponse(); CloseableHttpResponse response = null; count.getAndIncrement(); log.info("AppCallBackTask...begin" + count.get()); try { if (ApiConstants.SUCCESS_CODE.equals(result)) { //業務 if (result.equals("success")) { //業務 executorService.shutdown(); } } else { //業務 } } catch (Exception e) { log.error("AppCallBackTask異常錯誤" + e); } finally { try { response.close(); } catch (IOException e) { log.error("AppCallBackTask response null"); } finally { if (count.get() < SysConstants.APP_CALLBACK_TIMES.length - 1) { executorService.schedule(this, SysConstants.APP_CALLBACK_TIMES[count.get()], TimeUnit.SECONDS); } else { //業務 executorService.shutdown(); } } } }
AppCallBackTask是非同步於主業務流程的執行緒,持有一個呼叫自己的executorService物件,這樣就可以根據業務實現繼續定時,還是shutdown了。public static void main(String[] args) throws UnsupportedCharsetException, IOException { ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1); AppCallBackTask task = new AppCallBackTask(null, null, ApiConstants.FAILURE_CODE, executorService); executorService.schedule(task, 0, TimeUnit.SECONDS); }