import lombok.SneakyThrows;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created with IntelliJ IDEA.
*
* @Auther: zlf
* @Date: 2021/07/10/18:18
* @Description:
*/
public class main {
public static ScheduledThreadPoolExecutor spool;
public static void main(String[] args) throws ExecutionException, InterruptedException {
spool = new ScheduledThreadPoolExecutor(2);
CountDownLatch cdl = new CountDownLatch(5);
HttpEntity<Map<String, Object>> request = new HttpEntity<Map<String, Object>>(_meidi,headers);
ConcurrentHashMap<String, Future> futureMap = new ConcurrentHashMap<String, Future>();
requestTask requestTask = new requestTask(warnUrl,request,cdl,restTemplate,futureMap);
ScheduledFuture<?> scheduledFuture = spool.scheduleAtFixedRate(requestTask, 0, 5, TimeUnit.MINUTES);
futureMap.put("scheduledFuture",scheduledFuture);
// 必须关闭才行
spool.shutdownNow();
}
}
public class requestTask implements Runnable{
private AtomicInteger ait = new AtomicInteger(0);
private volatile CountDownLatch cdl;
private HttpEntity<Map<String, Object>> request;
private String url ;
private ConcurrentHashMap<String, Future> futureMap;
RestTemplate restTemplate;
public requestTask(String url ,HttpEntity<Map<String, Object>> request,CountDownLatch cdl,RestTemplate restTemplate,ConcurrentHashMap<String, Future> futureMap){
this.request = request;
this.url = url;
this.cdl = cdl;
this.restTemplate = restTemplate;
this.futureMap = futureMap;
}
@SneakyThrows
@Override
public void run() {
System.out.println("调用初始化流程");
cdl.countDown();
int i = ait.incrementAndGet();
ResponseEntity<String> entity = restTemplate.postForEntity(url, request, String.class);
String json = entity.getBody();
JSONObject jsonObject = JSONUtil.parseObj(json);
System.out.println(jsonObject);
String error = jsonObject.get("error", String.class);
if(!"success".equals(error)){
// 多次尝试
log.error("告警失败次数:{}",i);
if(i == 5){
// 不再尝试
// cdl.wait();
Future scheduledFuture = futureMap.remove("scheduledFuture");
scheduledFuture.cancel(true);
}
}else {
log.warn("报警成功");
log.warn("报警发送结果集: {}",JSONUtil.parseObj(request.getBody()).toString());
// cdl.wait();
Future scheduledFuture = futureMap.remove("scheduledFuture");
scheduledFuture.cancel(true);
}
}
}
一个定时demo
最新推荐文章于 2025-11-24 14:38:27 发布
本文介绍了如何使用Java的ScheduledThreadPoolExecutor进行定时任务调度,并关注了任务的超时处理和异常处理机制。通过实例展示了如何设置定时任务并处理告警失败的场景。
2701

被折叠的 条评论
为什么被折叠?



