|
|
|
|
@ -22,20 +22,26 @@ import com.ruoyi.cron.document.CronTask;
|
|
|
|
|
import com.ruoyi.cron.document.CronTaskLog;
|
|
|
|
|
import com.ruoyi.cron.event.CronTaskChangeEvent;
|
|
|
|
|
import com.ruoyi.cron.event.CronTaskEvent;
|
|
|
|
|
import com.ruoyi.cron.event.CronTaskLogEvent;
|
|
|
|
|
import com.ruoyi.cron.query.CronTaskLogQuery;
|
|
|
|
|
import com.ruoyi.cron.runner.CronBeanPostProcessor;
|
|
|
|
|
import com.ruoyi.cron.runner.CronRunner;
|
|
|
|
|
import com.ruoyi.cron.task.CronTaskTestTask;
|
|
|
|
|
import com.ruoyi.cron.vo.CronTaskVo;
|
|
|
|
|
import lombok.Getter;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
|
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
|
|
|
|
|
|
|
|
|
import javax.validation.constraints.NotEmpty;
|
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.TreeSet;
|
|
|
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
import static com.ruoyi.common.utils.MongoUtil.*;
|
|
|
|
|
@ -93,6 +99,62 @@ public class CronTaskApi {
|
|
|
|
|
return runner.getCurrentLogs().stream().filter(l -> l.getGroupId() == group).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final static List<MySseEmitter> emitters = new CopyOnWriteArrayList<>();
|
|
|
|
|
|
|
|
|
|
public static class MySseEmitter extends SseEmitter {
|
|
|
|
|
@Getter
|
|
|
|
|
private Integer id;
|
|
|
|
|
|
|
|
|
|
public MySseEmitter(long timeout, Integer id) {
|
|
|
|
|
super(timeout);
|
|
|
|
|
this.id = id;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 订阅某台机器人的信息
|
|
|
|
|
*
|
|
|
|
|
* @param id 0:表示订阅所有设备数据,负数表示非机器的订阅
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("/sse-{id}")
|
|
|
|
|
@SaIgnore
|
|
|
|
|
public SseEmitter subscribe(@PathVariable Integer id) {
|
|
|
|
|
if (id == null) {
|
|
|
|
|
id = 0;
|
|
|
|
|
}
|
|
|
|
|
MySseEmitter emitter = new MySseEmitter(Long.MAX_VALUE, id);
|
|
|
|
|
emitters.add(emitter);
|
|
|
|
|
emitter.onTimeout(() -> {
|
|
|
|
|
emitters.remove(emitter);
|
|
|
|
|
});
|
|
|
|
|
emitter.onCompletion(() -> {
|
|
|
|
|
emitters.remove(emitter);
|
|
|
|
|
});
|
|
|
|
|
emitter.onError(e -> {
|
|
|
|
|
emitters.remove(emitter);
|
|
|
|
|
});
|
|
|
|
|
return emitter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventListener
|
|
|
|
|
@Async
|
|
|
|
|
public void listenter(CronTaskLogEvent event) {
|
|
|
|
|
List<MySseEmitter> es = ListUtil.list(true);
|
|
|
|
|
for (MySseEmitter e : emitters) {
|
|
|
|
|
if (!event.getGroupId().equals(e.getId())) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
e.send(event);
|
|
|
|
|
} catch (Exception e1) {
|
|
|
|
|
es.add(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
emitters.removeAll(es);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping
|
|
|
|
|
@SaCheckPermission("sys:cron:add")
|
|
|
|
|
@Log(title = "定时任务", businessType = BusinessType.INSERT)
|
|
|
|
|
|