
com.aggrepoint.utils.http.HttpRepeat Maven / Gradle / Ivy
The newest version!
package com.aggrepoint.utils.http;
import java.util.ArrayList;
import java.util.List;
/**
*
* 基于HttpThrottling或HttpChannel不断重复执行请求任务
*
* 有任务执行时,HttpTaskRepeat内建立一个用于重复执行任务的线程。如果要执行的任务被清空,线程会被清除
*
* HttpTaskRepeat会一次性将所有要重复执行的任务提交执行,然后等待执行结果。因此HttpThrottling的队列容量需要大于
* 任务总数个数
*
*
* @author jiangmingyang
*/
public class HttpRepeat {
HttpRequester runner;
/** 需要反复循环执行的任务 */
private List repeatTask;
/** 执行反复循环任务的时间间隔 */
private long repeatInterval;
/** 负责执行循环任务的线程 */
private Thread repeateTaskThread;
public HttpRepeat(HttpRequester runner, long interval) {
this.runner = runner;
this.repeatInterval = interval;
}
/**
* 重设要反复执行的任务,返回之前的任务列表
*/
public List setTasks(List tasks) {
List current = repeatTask;
repeatTask = tasks;
if (repeatTask == null) // 清空要执行的任务,停止
repeateTaskThread = null;
else if (repeateTaskThread == null) {
repeateTaskThread = new Thread(() -> {
while (Thread.currentThread() == repeateTaskThread) {
long time = System.currentTimeMillis();
List list = null;
synchronized (repeatTask) {
try {
list = runner.request(repeatTask);
} catch (Exception e) {
}
}
// 阻塞至所有任务执行完毕
ResponseFuture.sync(list);
// { 等待下次运行
long wait = repeatInterval - (System.currentTimeMillis() - time);
if (wait > 0)
try {
Thread.sleep(wait);
} catch (Exception e) {
}
// }
}
});
repeateTaskThread.start();
}
return current;
}
/**
* 增加一个repeat task
*
* @param task
*/
public void addTask(HttpTask task) {
if (repeatTask == null) {
List list = new ArrayList<>();
list.add(task);
setTasks(list);
return;
}
synchronized (repeatTask) {
repeatTask.add(task);
}
}
public void removeTask(HttpTask task) {
synchronized (repeatTask) {
repeatTask.remove(task);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy