diff --git a/backend/pom.xml b/backend/pom.xml
index 8ed59a2fa0..2ec6c7ff5e 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -207,7 +207,7 @@
io.dataease
dataease-plugin-interface
- 1.6
+ 1.7
cn.hutool
diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
index 9e27662bf1..28072efd05 100644
--- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
@@ -17,16 +17,13 @@ import org.springframework.core.env.Environment;
import java.util.Date;
-
public class JWTUtils {
-
// token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token )
private static final long EXPIRE_TIME = 1 * 60 * 1000;
// 登录间隔时间10min 超过这个时间强制重新登录
private static long Login_Interval;
-
/**
* 校验token是否正确
*
@@ -82,7 +79,8 @@ public class JWTUtils {
public static boolean loginExpire(String token) {
if (Login_Interval == 0) {
// 默认超时时间是8h
- int minute = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout", Integer.class, 8 * 60);
+ Long minute = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout", Long.class,
+ 8 * 60L);
// 分钟换算成毫秒
Login_Interval = minute * 1000 * 60;
}
@@ -128,19 +126,19 @@ public class JWTUtils {
public static String signLink(String resourceId, Long userId, String secret) {
Algorithm algorithm = Algorithm.HMAC256(secret);
- if(userId == null){
+ if (userId == null) {
return JWT.create().withClaim("resourceId", resourceId).sign(algorithm);
- }else {
+ } else {
return JWT.create().withClaim("resourceId", resourceId).withClaim("userId", userId).sign(algorithm);
}
}
- public static boolean verifyLink(String token, String resourceId, Long userId, String secret) {
+ public static boolean verifyLink(String token, String resourceId, Long userId, String secret) {
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier;
- if(userId == null){
+ if (userId == null) {
verifier = JWT.require(algorithm).withClaim("resourceId", resourceId).build();
- }else {
+ } else {
verifier = JWT.require(algorithm).withClaim("resourceId", resourceId).withClaim("userId", userId).build();
}
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java
new file mode 100644
index 0000000000..efec50afcf
--- /dev/null
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java
@@ -0,0 +1,9 @@
+package io.dataease.base.mapper.ext;
+
+public interface ExtTaskMapper {
+
+ int runningCount(Long taskId);
+
+ void resetRunnings(Long taskId);
+
+}
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml
new file mode 100644
index 0000000000..213d5ae488
--- /dev/null
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+ update sys_task_instance set status = -1, info = 'System Interrupt Error' where task_id = #{taskId} and status = 0
+
+
+
diff --git a/backend/src/main/java/io/dataease/commons/constants/ColumnPermissionConstants.java b/backend/src/main/java/io/dataease/commons/constants/ColumnPermissionConstants.java
new file mode 100644
index 0000000000..52f1a00796
--- /dev/null
+++ b/backend/src/main/java/io/dataease/commons/constants/ColumnPermissionConstants.java
@@ -0,0 +1,10 @@
+package io.dataease.commons.constants;
+
+public class ColumnPermissionConstants {
+
+ public final static String Prohibit = "Prohibit";
+ public final static String Desensitization = "Desensitization";
+ public final static String Desensitization_desc = "******";
+
+
+}
diff --git a/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java
new file mode 100644
index 0000000000..d55d9e8a65
--- /dev/null
+++ b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java
@@ -0,0 +1,113 @@
+package io.dataease.commons.pool;
+
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import io.dataease.commons.utils.LogUtil;
+
+public class PriorityThreadPoolExecutor extends ThreadPoolExecutor {
+
+ public static AtomicInteger globaInteger = new AtomicInteger(1);
+
+ private ThreadLocal local = new ThreadLocal() {
+ @Override
+ protected Integer initialValue() {
+ return 1;
+ }
+ };
+
+ public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) {
+ super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue());
+ }
+
+ public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
+ ThreadFactory threadFactory) {
+ super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue(), threadFactory);
+ }
+
+ public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
+ RejectedExecutionHandler handler) {
+ super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue(), handler);
+ }
+
+ public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
+ ThreadFactory threadFactory, RejectedExecutionHandler handler) {
+ super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue(), threadFactory, handler);
+ }
+
+ protected static PriorityBlockingQueue getWorkQueue() {
+ return new PriorityBlockingQueue();
+ }
+
+ @Override
+ public void execute(Runnable command) {
+ int andIncrement = globaInteger.getAndIncrement();
+ Integer theadInteger = local.get();
+ try {
+ if (theadInteger == 0) {
+ this.execute(command, 0);
+ } else {
+ this.execute(command, andIncrement);
+ }
+
+ } finally {
+ local.set(1);
+ }
+ }
+
+ public void execute(Runnable command, int priority) {
+ super.execute(new PriorityRunnable(command, priority));
+ }
+
+ public Future submit(Callable task, int priority) {
+ local.set(priority);
+ return super.submit(task);
+ }
+
+ protected static class PriorityRunnable>
+ implements Runnable, Comparable> {
+ private final static AtomicLong seq = new AtomicLong();
+ private final long seqNum;
+ Runnable run;
+ private int priority;
+
+ public PriorityRunnable(Runnable run, int priority) {
+ seqNum = seq.getAndIncrement();
+ this.run = run;
+ this.priority = priority;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+
+ public Runnable getRun() {
+ return run;
+ }
+
+ @Override
+ public void run() {
+ LogUtil.info("number " + priority + " is starting...");
+ this.run.run();
+ }
+
+ @Override
+ public int compareTo(PriorityRunnable other) {
+ int res = 0;
+ if (this.priority == other.priority) {
+ if (other.run != this.run) {// ASC
+ res = (seqNum < other.seqNum ? -1 : 1);
+ }
+ } else {// DESC
+ res = this.priority > other.priority ? 1 : -1;
+ }
+ return res;
+ }
+ }
+
+}
diff --git a/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java
new file mode 100644
index 0000000000..efb807ba86
--- /dev/null
+++ b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java
@@ -0,0 +1,17 @@
+package io.dataease.commons.pool;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import lombok.Data;
+
+@ConfigurationProperties(prefix = "detask", ignoreInvalidFields = true)
+@Data
+@Component
+public class PriorityThreadPoolProperties {
+
+ private int corePoolSize = 2;
+ private int maximumPoolSize = 100;
+ private int keepAliveTime = 60;
+
+}
diff --git a/backend/src/main/java/io/dataease/config/AsyncConfig.java b/backend/src/main/java/io/dataease/config/AsyncConfig.java
index 22a88ef995..8a8786c294 100644
--- a/backend/src/main/java/io/dataease/config/AsyncConfig.java
+++ b/backend/src/main/java/io/dataease/config/AsyncConfig.java
@@ -1,15 +1,25 @@
package io.dataease.config;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.Resource;
+
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import io.dataease.commons.pool.PriorityThreadPoolExecutor;
+import io.dataease.commons.pool.PriorityThreadPoolProperties;
+
@EnableAsync(proxyTargetClass = true)
@Configuration
public class AsyncConfig {
+ @Resource
+ private PriorityThreadPoolProperties priorityThreadPoolProperties;
+
@Bean
public AsyncTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
@@ -18,4 +28,18 @@ public class AsyncConfig {
executor.setMaxPoolSize(10);
return executor;
}
+
+ @Bean
+ public PriorityThreadPoolExecutor priorityExecutor() {
+ int corePoolSize = priorityThreadPoolProperties.getCorePoolSize();
+
+ int maximumPoolSize = priorityThreadPoolProperties.getMaximumPoolSize();
+
+ int keepAliveTime = priorityThreadPoolProperties.getKeepAliveTime();
+
+ PriorityThreadPoolExecutor executor = new PriorityThreadPoolExecutor(corePoolSize, maximumPoolSize,
+ keepAliveTime, TimeUnit.SECONDS);
+ return executor;
+ }
+
}
diff --git a/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java b/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java
index 3c42edf228..efa12809b8 100644
--- a/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java
+++ b/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java
@@ -15,6 +15,8 @@ public class DBTableDTO {
private String datasourceId;
@ApiModelProperty("数据源名称")
private String name;
+ @ApiModelProperty("表注释")
+ private String remark;
@ApiModelProperty("启用检测")
private boolean enableCheck;
@ApiModelProperty("数据集路径")
diff --git a/backend/src/main/java/io/dataease/dto/datasource/TableDesc.java b/backend/src/main/java/io/dataease/dto/datasource/TableDesc.java
new file mode 100644
index 0000000000..e53066e9d7
--- /dev/null
+++ b/backend/src/main/java/io/dataease/dto/datasource/TableDesc.java
@@ -0,0 +1,15 @@
+package io.dataease.dto.datasource;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class TableDesc {
+ @ApiModelProperty("表名称")
+ private String name;
+ @ApiModelProperty("表备注")
+ private String remark;
+}
diff --git a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java
index c93e59e11c..3a41798e93 100644
--- a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java
+++ b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java
@@ -28,7 +28,7 @@ public class ScheduleManager {
* @throws SchedulerException
*/
public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class extends Job> cls, int repeatIntervalTime,
- JobDataMap jobDataMap) throws SchedulerException {
+ JobDataMap jobDataMap) throws SchedulerException {
JobBuilder jobBuilder = JobBuilder.newJob(cls).withIdentity(jobKey);
@@ -46,7 +46,8 @@ public class ScheduleManager {
scheduler.scheduleJob(jd, trigger);
}
- public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class extends Job> cls, int repeatIntervalTime) throws SchedulerException {
+ public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class extends Job> cls, int repeatIntervalTime)
+ throws SchedulerException {
addSimpleJob(jobKey, triggerKey, cls, repeatIntervalTime);
}
@@ -59,7 +60,8 @@ public class ScheduleManager {
* @param cron
* @param jobDataMap
*/
- public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime, JobDataMap jobDataMap) {
+ public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime,
+ Date endTime, JobDataMap jobDataMap) {
try {
LogUtil.info("addCronJob: " + triggerKey.getName() + "," + triggerKey.getGroup());
@@ -99,7 +101,8 @@ public class ScheduleManager {
}
}
- public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime) {
+ public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime,
+ Date endTime) {
addCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null);
}
@@ -140,7 +143,8 @@ public class ScheduleManager {
* @param cron
* @throws SchedulerException
*/
- public void modifyCronJobTime(TriggerKey triggerKey, String cron, Date startTime, Date endTime) throws SchedulerException {
+ public void modifyCronJobTime(TriggerKey triggerKey, String cron, Date startTime, Date endTime)
+ throws SchedulerException {
LogUtil.info("modifyCronJobTime: " + triggerKey.getName() + "," + triggerKey.getGroup());
@@ -151,7 +155,6 @@ public class ScheduleManager {
return;
}
-
/** 方式一 :调用 rescheduleJob 开始 */
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();// 触发器
@@ -279,7 +282,6 @@ public class ScheduleManager {
}
}
-
public static void startJobs(Scheduler sched) {
try {
sched.start();
@@ -289,7 +291,6 @@ public class ScheduleManager {
}
}
-
public void shutdownJobs(Scheduler sched) {
try {
if (!sched.isShutdown()) {
@@ -312,7 +313,7 @@ public class ScheduleManager {
* @throws SchedulerException
*/
public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz,
- int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
+ int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
if (scheduler.checkExists(triggerKey)) {
modifySimpleJobTime(triggerKey, intervalTime);
@@ -323,7 +324,7 @@ public class ScheduleManager {
}
public void addOrUpdateSingleJob(JobKey jobKey, TriggerKey triggerKey, Class clz,
- Date date, JobDataMap jobDataMap) throws SchedulerException {
+ Date date, JobDataMap jobDataMap) throws SchedulerException {
if (scheduler.checkExists(triggerKey)) {
modifySingleJobTime(triggerKey, date);
} else {
@@ -333,15 +334,15 @@ public class ScheduleManager {
}
public void addOrUpdateSingleJob(JobKey jobKey, TriggerKey triggerKey, Class clz,
- Date date) throws SchedulerException {
+ Date date) throws SchedulerException {
addOrUpdateSingleJob(jobKey, triggerKey, clz, date, null);
}
- public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, int intervalTime) throws SchedulerException {
+ public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, int intervalTime)
+ throws SchedulerException {
addOrUpdateSimpleJob(jobKey, triggerKey, clz, intervalTime, null);
}
-
/**
* 添加或修改 cronJob
*
@@ -352,7 +353,8 @@ public class ScheduleManager {
* @param jobDataMap
* @throws SchedulerException
*/
- public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime, JobDataMap jobDataMap) throws SchedulerException {
+ public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime,
+ Date endTime, JobDataMap jobDataMap) throws SchedulerException {
LogUtil.info("AddOrUpdateCronJob: " + jobKey.getName() + "," + triggerKey.getGroup());
@@ -363,7 +365,8 @@ public class ScheduleManager {
}
}
- public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime) throws SchedulerException {
+ public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime,
+ Date endTime) throws SchedulerException {
addOrUpdateCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null);
}
@@ -398,7 +401,8 @@ public class ScheduleManager {
if (!CronExpression.isValidExpression(cron)) {
DataEaseException.throwException("cron :" + cron + " error");
}
- return TriggerBuilder.newTrigger().withIdentity("Calculate Date").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
+ return TriggerBuilder.newTrigger().withIdentity("Calculate Date")
+ .withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
}
diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java
index c685930a17..87dff10bdf 100644
--- a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java
+++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java
@@ -13,9 +13,6 @@ import java.util.Date;
public abstract class TaskHandler implements InitializingBean {
- private static final String[] week = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
-
-
public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception {
// 1。首先看看是否过期
Long endTime = taskEntity.getEndTime();
@@ -30,12 +27,11 @@ public abstract class TaskHandler implements InitializingBean {
if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) {
new Date(taskEntity.getEndTime());
}
- Class executor = this.getClass();
+ Class extends TaskHandler> executor = this.getClass();
String cron = cron(taskEntity);
scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(taskEntity));
}
-
protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity);
private String cron(GlobalTaskEntity taskEntity) {
@@ -54,36 +50,34 @@ public abstract class TaskHandler implements InitializingBean {
instance.setTime(date);
if (taskEntity.getRateType() == 0) {
- return
- instance.get(Calendar.SECOND) + " " +
- instance.get(Calendar.MINUTE) + " " +
- instance.get(Calendar.HOUR_OF_DAY) + " * * ?";
+ return instance.get(Calendar.SECOND) + " " +
+ instance.get(Calendar.MINUTE) + " " +
+ instance.get(Calendar.HOUR_OF_DAY) + " * * ?";
}
if (taskEntity.getRateType() == 1) {
- return
- instance.get(Calendar.SECOND) + " " +
- instance.get(Calendar.MINUTE) + " " +
- instance.get(Calendar.HOUR_OF_DAY) + " ? * " +
- getDayOfWeek(instance);
+ return instance.get(Calendar.SECOND) + " " +
+ instance.get(Calendar.MINUTE) + " " +
+ instance.get(Calendar.HOUR_OF_DAY) + " ? * " +
+ getDayOfWeek(instance);
}
if (taskEntity.getRateType() == 2) {
- return
- instance.get(Calendar.SECOND) + " " +
- instance.get(Calendar.MINUTE) + " " +
- instance.get(Calendar.HOUR_OF_DAY) + " " +
- instance.get(Calendar.DATE) + " * ?";
+ return instance.get(Calendar.SECOND) + " " +
+ instance.get(Calendar.MINUTE) + " " +
+ instance.get(Calendar.HOUR_OF_DAY) + " " +
+ instance.get(Calendar.DATE) + " * ?";
}
return null;
}
+ public abstract void resetRunningInstance(Long taskId);
+
private String getDayOfWeek(Calendar instance) {
int index = instance.get(Calendar.DAY_OF_WEEK);
- index = (index + 1) % 7;
+ index = (index + 1) % 7;
return String.valueOf(index);
}
-
public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) {
JobKey jobKey = new JobKey(taskEntity.getTaskId().toString());
TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString());
@@ -95,14 +89,16 @@ public abstract class TaskHandler implements InitializingBean {
scheduleManager.fireNow(jobKey);
}
-
- //判断任务是否过期
+ // 判断任务是否过期
public Boolean taskExpire(Long endTime) {
- if (ObjectUtils.isEmpty(endTime)) return false;
+ if (ObjectUtils.isEmpty(endTime))
+ return false;
Long now = System.currentTimeMillis();
return now > endTime;
}
+ protected abstract Boolean taskIsRunning(Long taskId);
+
@Override
public void afterPropertiesSet() throws Exception {
String beanName = null;
diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java
index d84ba736de..12ba9352a2 100644
--- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java
+++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java
@@ -5,6 +5,7 @@ import io.dataease.auth.entity.TokenInfo;
import io.dataease.auth.service.AuthUserService;
import io.dataease.auth.service.impl.AuthUserServiceImpl;
import io.dataease.auth.util.JWTUtils;
+import io.dataease.base.mapper.ext.ExtTaskMapper;
import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.ServletUtils;
@@ -20,6 +21,7 @@ import io.dataease.service.system.EmailService;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.quartz.*;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -46,6 +48,16 @@ public class EmailTaskHandler extends TaskHandler implements Job {
return jobDataMap;
}
+ public EmailTaskHandler proxy() {
+ return CommonBeanFactory.getBean(EmailTaskHandler.class);
+ }
+
+ @Override
+ protected Boolean taskIsRunning(Long taskId) {
+ ExtTaskMapper extTaskMapper = CommonBeanFactory.getBean(ExtTaskMapper.class);
+ return extTaskMapper.runningCount(taskId) > 0;
+ }
+
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 插件没有加载 空转
@@ -54,11 +66,16 @@ public class EmailTaskHandler extends TaskHandler implements Job {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity");
+ ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class);
if (taskExpire(taskEntity.getEndTime())) {
- ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class);
removeTask(scheduleManager, taskEntity);
return;
}
+ if (taskIsRunning(taskEntity.getTaskId())) {
+ LogUtil.info("Skip synchronization task: {} ,due to task status is {}",
+ taskEntity.getTaskId(), "running");
+ return;
+ }
GlobalTaskInstance taskInstance = buildInstance(taskEntity);
Long instanceId = saveInstance(taskInstance);
@@ -67,10 +84,15 @@ public class EmailTaskHandler extends TaskHandler implements Job {
XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate");
SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator");
LogUtil.info("start execute send panel report task...");
- sendReport(taskInstance, emailTemplate, creator);
+ proxy().sendReport(taskInstance, emailTemplate, creator);
}
+ @Override
+ public void resetRunningInstance(Long taskId) {
+ ExtTaskMapper extTaskMapper = CommonBeanFactory.getBean(ExtTaskMapper.class);
+ extTaskMapper.resetRunnings(taskId);
+ }
public Long saveInstance(GlobalTaskInstance taskInstance) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
@@ -99,11 +121,12 @@ public class EmailTaskHandler extends TaskHandler implements Job {
emailXpackService.saveInstance(taskInstance);
}
-
+ @Async("priorityExecutor")
public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO,
- SysUserEntity user) {
+ SysUserEntity user) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
try {
+
String panelId = emailTemplateDTO.getPanelId();
String url = panelUrl(panelId);
String token = tokenByUser(user);
@@ -116,11 +139,15 @@ public class EmailTaskHandler extends TaskHandler implements Job {
String recipients = emailTemplateDTO.getRecipients();
byte[] content = emailTemplateDTO.getContent();
EmailService emailService = SpringContextUtil.getBean(EmailService.class);
+
String contentStr = "";
if (ObjectUtils.isNotEmpty(content)) {
contentStr = new String(content, "UTF-8");
}
- emailService.sendWithImage(recipients, emailTemplateDTO.getTitle(), contentStr, bytes);
+ emailService.sendWithImage(recipients, emailTemplateDTO.getTitle(),
+ contentStr, bytes);
+
+ Thread.sleep(10000);
success(taskInstance);
} catch (Exception e) {
error(taskInstance, e);
diff --git a/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java b/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java
index c7361ee93b..c8de41274a 100644
--- a/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java
+++ b/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java
@@ -32,6 +32,7 @@ public class GlobalTaskStartListener implements ApplicationListener {
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
try {
+ taskHandler.resetRunningInstance(task.getTaskId());
taskHandler.addTask(scheduleManager, task);
} catch (Exception e) {
e.printStackTrace();
diff --git a/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java b/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java
new file mode 100644
index 0000000000..78d3e30215
--- /dev/null
+++ b/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java
@@ -0,0 +1,97 @@
+package io.dataease.plugins.server;
+
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import io.dataease.commons.utils.PageUtils;
+import io.dataease.commons.utils.Pager;
+import io.dataease.i18n.Translator;
+import io.dataease.plugins.common.entity.XpackConditionEntity;
+import io.dataease.plugins.common.entity.XpackGridRequest;
+import io.dataease.plugins.config.SpringContextUtil;
+import io.dataease.plugins.xpack.auth.dto.request.DataSetColumnPermissionsDTO;
+import io.dataease.plugins.xpack.auth.dto.request.DataSetRowPermissionsDTO;
+import io.dataease.plugins.xpack.auth.dto.request.DatasetColumnPermissions;
+import io.dataease.plugins.xpack.auth.dto.request.DatasetRowPermissions;
+import io.dataease.plugins.xpack.auth.service.ColumnPermissionService;
+import io.dataease.plugins.xpack.auth.service.RowPermissionService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("plugin/dataset/columnPermissions")
+public class ColumnPermissionsController {
+
+
+ @ApiOperation("保存")
+ @PostMapping("save")
+ public void save(@RequestBody DatasetColumnPermissions datasetColumnPermissions) throws Exception {
+ ColumnPermissionService columnPermissionService = SpringContextUtil.getBean(ColumnPermissionService.class);
+ DataSetColumnPermissionsDTO request = new DataSetColumnPermissionsDTO();
+ request.setAuthTargetType(datasetColumnPermissions.getAuthTargetType());
+ request.setAuthTargetId(datasetColumnPermissions.getAuthTargetId());
+ request.setDatasetId(datasetColumnPermissions.getDatasetId());
+ List columnPermissionsDTOS = columnPermissionService.searchPermissions(request);
+ if(StringUtils.isEmpty(datasetColumnPermissions.getId())){
+ if(!CollectionUtils.isEmpty(columnPermissionsDTOS)){
+ throw new Exception(Translator.get("i18n_rp_exist"));
+ }
+ }else {
+ if(!CollectionUtils.isEmpty(columnPermissionsDTOS) && columnPermissionsDTOS.size() > 1){
+ throw new Exception(Translator.get("i18n_rp_exist"));
+ }
+ if(columnPermissionsDTOS.size() == 1 && !columnPermissionsDTOS.get(0).getId().equalsIgnoreCase(datasetColumnPermissions.getId())){
+ throw new Exception(Translator.get("i18n_rp_exist"));
+ }
+ }
+ columnPermissionService.save(datasetColumnPermissions);
+ }
+
+ @ApiOperation("查询")
+ @PostMapping("/list")
+ public List searchPermissions(@RequestBody DataSetColumnPermissionsDTO request) {
+ ColumnPermissionService columnPermissionService = SpringContextUtil.getBean(ColumnPermissionService.class);
+ return columnPermissionService.searchPermissions(request);
+ }
+
+ @ApiOperation("删除")
+ @PostMapping("/delete/{id}")
+ public void delete(@PathVariable String id) {
+ ColumnPermissionService columnPermissionService = SpringContextUtil.getBean(ColumnPermissionService.class);
+ columnPermissionService.delete(id);
+ }
+
+ @ApiOperation("分页查询")
+ @PostMapping("/pageList/{datasetId}/{goPage}/{pageSize}")
+ public Pager> rowPermissions(@PathVariable String datasetId, @PathVariable int goPage, @PathVariable int pageSize, @RequestBody XpackGridRequest request) {
+ Page