1. 程式人生 > >一個簡單的定時通知回撥執行緒實現

一個簡單的定時通知回撥執行緒實現

在日常的工作中,遇到如下的業務場景,類似於微信或者支付寶支付後定時通知呼叫方,每隔15/15/30/60...秒都要執行一次通知,於是自己實現瞭如下的程式碼。

通知執行緒是一個定時的執行緒,並且與主業務執行緒分離。

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();
				}
			}
		}

	}
寫一個main方法進行測試
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);
	}
AppCallBackTask是非同步於主業務流程的執行緒,持有一個呼叫自己的executorService物件,這樣就可以根據業務實現繼續定時,還是shutdown了。