update 尝试定时任务日志的实时显示采用sse实现()

master
管理员 1 year ago
parent 94710b154f
commit 2a5c41a1ba

@ -22,20 +22,26 @@ import com.ruoyi.cron.document.CronTask;
import com.ruoyi.cron.document.CronTaskLog; import com.ruoyi.cron.document.CronTaskLog;
import com.ruoyi.cron.event.CronTaskChangeEvent; import com.ruoyi.cron.event.CronTaskChangeEvent;
import com.ruoyi.cron.event.CronTaskEvent; import com.ruoyi.cron.event.CronTaskEvent;
import com.ruoyi.cron.event.CronTaskLogEvent;
import com.ruoyi.cron.query.CronTaskLogQuery; import com.ruoyi.cron.query.CronTaskLogQuery;
import com.ruoyi.cron.runner.CronBeanPostProcessor; import com.ruoyi.cron.runner.CronBeanPostProcessor;
import com.ruoyi.cron.runner.CronRunner; import com.ruoyi.cron.runner.CronRunner;
import com.ruoyi.cron.task.CronTaskTestTask; import com.ruoyi.cron.task.CronTaskTestTask;
import com.ruoyi.cron.vo.CronTaskVo; import com.ruoyi.cron.vo.CronTaskVo;
import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import java.util.List; import java.util.List;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.ruoyi.common.utils.MongoUtil.*; 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()); 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 @PostMapping
@SaCheckPermission("sys:cron:add") @SaCheckPermission("sys:cron:add")
@Log(title = "定时任务", businessType = BusinessType.INSERT) @Log(title = "定时任务", businessType = BusinessType.INSERT)

@ -0,0 +1,27 @@
package com.ruoyi.cron.event;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
import java.time.Clock;
@Getter
public class CronTaskLogEvent extends ApplicationEvent {
private String taskId;
private Integer groupId;
private String ex;
public CronTaskLogEvent(String taskId, Integer groupId, String ex) {
super(groupId);
this.taskId = taskId;
this.groupId = groupId;
this.ex = ex;
}
@Override
public Integer getSource() {
return (Integer) super.getSource();
}
}

@ -2,8 +2,10 @@ package com.ruoyi.cron.runner;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.cron.TaskLog; import com.ruoyi.cron.TaskLog;
import com.ruoyi.cron.document.CronTaskLog; import com.ruoyi.cron.document.CronTaskLog;
import com.ruoyi.cron.event.CronTaskLogEvent;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date; import java.util.Date;
@ -18,10 +20,12 @@ public class TaskLogImpl implements TaskLog {
if (logHolder.get() == null) { if (logHolder.get() == null) {
return; return;
} }
String ex = DateUtil.format(new Date(), "HH:mm:ss.SSS ")+ Thread.currentThread().getName()+ "\t : " + msg;
if (StrUtil.isBlank(logHolder.get().getEx())) { if (StrUtil.isBlank(logHolder.get().getEx())) {
logHolder.get().setEx(DateUtil.format(new Date(), "HH:mm:ss.SSS ")+ Thread.currentThread().getName()+ "\t : " + msg); logHolder.get().setEx(ex);
} else { } else {
logHolder.get().setEx(logHolder.get().getEx() + DateUtil.format(new Date(), "\nHH:mm:ss.SSS ")+ Thread.currentThread().getName()+ "\t : " + msg); logHolder.get().setEx(logHolder.get().getEx() + "\n" + ex);
} }
SpringUtils.publishEvent(new CronTaskLogEvent(logHolder.get().getTaskId(),logHolder.get().getGroupId(),ex));
} }
} }

Loading…
Cancel
Save