上传备份

master
王兵 3 weeks ago
parent 3ea749c0d1
commit c779c3fb0b

@ -1,11 +1,13 @@
package xyz.wbsite.jmacro;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.collection.CollUtil;
import org.jobrunr.jobs.lambdas.JobLambda;
import xyz.wbsite.jmacro.base.Legend;
import xyz.wbsite.jmacro.util.DialogUtil;
import xyz.wbsite.jmacro.util.Logger;
import java.io.File;
import java.util.List;
/**
* 线
@ -36,18 +38,25 @@ public class JMainService {
/**
* 线
*/
public DaemonThread daemonThread;
public MacroTask macroTask = new MacroTask();
/**
*
*/
private JMacro macro;
/**
*
*/
private int count;
/**
*
*/
private JMainService() {
Logger.info("初始化服务");
}
public JMacro getMacro() {
@ -59,15 +68,6 @@ public class JMainService {
Legend.setDefaultBase(legendDir);
}
public void createDaemon() {
Logger.info("初始化线程");
this.daemonThread = new DaemonThread();
this.daemonThread.setDaemon(true);
Logger.info("启动线程");
this.run = true;
this.daemonThread.start();
}
public static boolean start() {
if (JMainService.getInstance().macro.getWorkRegion() == null) {
JMainService.getInstance().macro.startFocus();
@ -79,8 +79,8 @@ public class JMainService {
return false;
}
// 创建线程
JMainService.getInstance().createDaemon();
// 4. 指定每天固定时间点执行
List<String> times = CollUtil.newArrayList("08:00", "12:35", "18:10");
return true;
}
@ -96,15 +96,14 @@ public class JMainService {
JMainService.getInstance().macro.stop();
}
// 关闭守护线程
JMainService.getInstance().daemonThread.interrupt();
Logger.info("正在停止脚本");
Logger.info("服务已停止");
return true;
}
/**
* 线
*/
public class DaemonThread extends Thread {
public class MacroTask implements Runnable {
@Override
public void run() {
@ -113,31 +112,20 @@ public class JMainService {
return;
}
int intervalValue = JProp.getInstance().getInt("interval", 60);
int timesValue = JProp.getInstance().getInt("times", 3);
int index = 0;
do {
Logger.info("第{}/{}次正在执行", index + 1, timesValue);
try {
macro.start();
if (index >= timesValue - 1) {
Logger.info("第{}/{}次执行结束", index + 1, timesValue);
} else {
Logger.info("第{}/{}次执行结束,休眠{}秒", index + 1, timesValue, intervalValue);
ThreadUtil.sleep(intervalValue * 1000L);
}
} catch (Exception e) {
if (e.getMessage().contains(InterruptedException.class.getSimpleName())) {
// 服务停止
} else {
Logger.info("异常中断");
}
++count;
Logger.info("第{}次开始执行>>>>>>", count);
try {
macro.start();
} catch (Exception e) {
if (e.getMessage().contains(InterruptedException.class.getSimpleName())) {
// 服务停止
} else {
Logger.info("第{}次中断执行>>>>>>", count);
}
index++;
} while (index < timesValue && run);
}
JMainController.getInstance().onStop();
Logger.info("执行结束,守护线程已退出");
Logger.info("第{}次执行结束>>>>>>", count);
}
}
}

@ -0,0 +1,217 @@
package xyz.wbsite.jmacro;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* JScheduler: ScheduledExecutorService
* <p>
* 1.
* 2.
*
* @author wangbing
* @version 0.0.1
* @since 1.8
*/
public class JScheduler {
/**
* 线
*/
private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
/**
* ID ScheduledFuture<?>
*/
private final Map<String, ScheduledFuture<?>> tasks = new ConcurrentHashMap<>();
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
/**
*
*
* @param taskId ID
* @param task
* @param initialDelay
* @param delay
* @param unit
*/
public void scheduleFixedDelay(String taskId, Runnable task, long initialDelay, long delay, TimeUnit unit) {
cancelTask(taskId);
ScheduledFuture<?> future = executor.scheduleWithFixedDelay(task, initialDelay, delay, unit);
tasks.put(taskId, future);
}
/**
*
*
* @param taskId ID
* @param task
* @param initialDelay
* @param period
* @param unit
* @param times
*/
public void scheduleFixedTimes(String taskId, Runnable task, long initialDelay, long period, TimeUnit unit, int times) {
cancelTask(taskId);
ScheduledFuture<?> future = executor.scheduleWithFixedDelay(new LimitedTask(task, times), initialDelay, period, unit);
tasks.put(taskId, future);
}
/**
* "08:30:00,12:00:00,18:00:00"
*
* @param taskId ID
* @param task
* @param timePoints
*/
public void scheduleAtTimes(String taskId, Runnable task, String timePoints) {
cancelTask(taskId);
List<LocalTime> times = parseTimePoints(timePoints);
if (times.isEmpty()) return;
Runnable timeChecker = () -> {
LocalTime now = LocalTime.now();
for (LocalTime scheduledTime : times) {
if (isSameTime(now, scheduledTime)) {
task.run();
}
}
};
// 每秒检查一次
ScheduledFuture<?> future = executor.scheduleAtFixedRate(timeChecker, 0, 1, TimeUnit.SECONDS);
tasks.put(taskId, future);
}
/**
*
*/
public void cancelAllTask() {
for (ScheduledFuture<?> future : tasks.values()) {
future.cancel(false);
}
tasks.clear();
}
/**
*
*
* @param taskId ID
*/
public void cancelTask(String taskId) {
ScheduledFuture<?> future = tasks.remove(taskId);
if (future != null) {
future.cancel(false);
}
}
/**
*
*/
public void shutdown() {
executor.shutdown();
}
/**
*
*
* @param timePoints
* @return
*/
private List<LocalTime> parseTimePoints(String timePoints) {
List<LocalTime> result = new ArrayList<>();
if (timePoints == null || timePoints.trim().isEmpty()) return result;
String[] parts = timePoints.split(",");
for (String part : parts) {
try {
result.add(LocalTime.parse(part.trim(), TIME_FORMATTER));
} catch (Exception e) {
System.err.println("无效的时间格式: " + part.trim());
}
}
return result;
}
/**
*
*
* @param t1 1
* @param t2 2
* @return
*/
private boolean isSameTime(LocalTime t1, LocalTime t2) {
return t1.getHour() == t2.getHour() &&
t1.getMinute() == t2.getMinute() &&
t1.getSecond() == t2.getSecond();
}
/**
*
*/
private class LimitedTask implements Runnable {
private final Runnable task;
private int remainingTimes;
LimitedTask(Runnable task, int times) {
this.task = task;
this.remainingTimes = times;
}
@Override
public void run() {
if (remainingTimes > 0) {
task.run();
remainingTimes--;
if (remainingTimes == 0) {
// 任务执行完毕,取消自己
for (Map.Entry<String, ScheduledFuture<?>> entry : tasks.entrySet()) {
if (entry.getValue().isDone()) {
tasks.remove(entry.getKey());
}
}
}
}
}
}
public static void main(String[] args) {
JScheduler scheduler = new JScheduler();
// 1. 无限循环任务每2秒执行一次
scheduler.scheduleFixedDelay("task1",
() -> System.out.println("无限任务执行: " + LocalTime.now()),
0, 2, TimeUnit.SECONDS);
// 2. 有限次数任务执行5次每1秒一次
scheduler.scheduleFixedTimes("task2",
() -> System.out.println("有限任务执行: " + LocalTime.now()),
0, 1, TimeUnit.SECONDS, 5);
// 3. 多时间点任务(每天 08:30:00, 12:00:00, 18:00:00 执行)
scheduler.scheduleAtTimes("task3",
() -> System.out.println("定时任务执行: " + LocalTime.now()),
"08:30:00,12:00:00,18:00:00");
// 运行一段时间后关闭
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.cancelAllTask();
scheduler.shutdown();
}
}

@ -135,15 +135,6 @@ public class TaskUtil extends CronUtil {
return service.scheduleAtFixedRate(runnable, initialDelay, delay, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) {
TaskUtil.execTask(new Runnable() {
@Override
public void run() {
System.out.println("1");
}
}, 3, 3000);
}
/**
*
*

Loading…
Cancel
Save

Powered by TurnKey Linux.