Przeglądaj źródła

增加current-user,解决在定时任务等非http请求的情况下,定义user

zhouhao 8 lat temu
rodzic
commit
45e625b4c3

+ 11 - 1
hsweb-web-core/src/main/java/org/hsweb/web/core/utils/WebUtil.java

@@ -54,6 +54,16 @@ public class WebUtil {
         return null;
     }
 
+    public static User setCurrentUser(User user) {
+        ThreadLocalUtils.put("current-user", user);
+        return user;
+    }
+
+    public static void removeCurrentUser() {
+        ThreadLocalUtils.remove("current-user");
+    }
+
+
     /**
      * 在HttpServletRequest中获取当前登录的用户
      *
@@ -61,7 +71,7 @@ public class WebUtil {
      * @return 当前登录的用户
      */
     public static User getLoginUser(HttpServletRequest request) {
-        if (request == null) return null;
+        if (request == null) return ThreadLocalUtils.get("current-user");
         HttpSession session = request.getSession(false);
         if (session == null) {
             OAuth2Manager manager = OAuth2ManagerHolder.getManager();

+ 57 - 43
hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/quartz/SimpleJob.java

@@ -25,8 +25,11 @@ import org.hsweb.expands.script.engine.ExecuteResult;
 import org.hsweb.expands.script.engine.ScriptContext;
 import org.hsweb.web.bean.po.quartz.QuartzJob;
 import org.hsweb.web.bean.po.quartz.QuartzJobHistory;
+import org.hsweb.web.bean.po.user.User;
+import org.hsweb.web.core.utils.WebUtil;
 import org.hsweb.web.service.quartz.QuartzJobHistoryService;
 import org.hsweb.web.service.quartz.QuartzJobService;
+import org.hsweb.web.service.user.UserService;
 import org.quartz.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,6 +44,7 @@ public class SimpleJob implements Job {
     protected QuartzJobService        quartzJobService;
     protected QuartzJobHistoryService quartzJobHistoryService;
     protected Map<String, Object>     defaultVar;
+    protected User                    defaultUser;
 
     /**
      * 子类必须实现此构造方法,否则无法创建任务
@@ -55,55 +59,61 @@ public class SimpleJob implements Job {
 
     @Override
     public void execute(JobExecutionContext context) throws JobExecutionException {
-        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
-        String id = jobDataMap.getString(SimpleJobFactory.QUARTZ_ID_KEY);
-        Assert.notNull(id, "定时任务ID错误");
-        QuartzJob job = quartzJobService.selectByPk(id);
-        Assert.notNull(job, "任务不存在");
-        if (logger.isDebugEnabled())
-            logger.debug("start job [{}],data : {}", job.getName(), jobDataMap);
-        DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(job.getLanguage());
-        String scriptId = "quartz.job.".concat(id);
+        //初始化用户信息
         try {
-            if (!engine.compiled(scriptId)) {
-                engine.compile(scriptId, job.getScript());
-            } else {
-                ScriptContext scriptContext = engine.getContext(scriptId);
-                //脚本发生了变化,自动重新编译
-                if (!MD5.defaultEncode(job.getScript()).equals(scriptContext.getMd5())) {
-                    if (logger.isDebugEnabled())
-                        logger.debug("script is changed,recompile....");
+            //解决定时任务获取当前用户
+            WebUtil.setCurrentUser(defaultUser);
+            JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
+            String id = jobDataMap.getString(SimpleJobFactory.QUARTZ_ID_KEY);
+            Assert.notNull(id, "定时任务ID错误");
+            QuartzJob job = quartzJobService.selectByPk(id);
+            Assert.notNull(job, "任务不存在");
+            if (logger.isDebugEnabled())
+                logger.debug("start job [{}],data : {}", job.getName(), jobDataMap);
+            DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(job.getLanguage());
+            String scriptId = "quartz.job.".concat(id);
+            try {
+                if (!engine.compiled(scriptId)) {
                     engine.compile(scriptId, job.getScript());
+                } else {
+                    ScriptContext scriptContext = engine.getContext(scriptId);
+                    //脚本发生了变化,自动重新编译
+                    if (!MD5.defaultEncode(job.getScript()).equals(scriptContext.getMd5())) {
+                        if (logger.isDebugEnabled())
+                            logger.debug("script is changed,recompile....");
+                        engine.compile(scriptId, job.getScript());
+                    }
                 }
+            } catch (Exception e) {
+                throw new JobExecutionException("编译任务脚本失败", e);
             }
-        } catch (Exception e) {
-            throw new JobExecutionException("编译任务脚本失败", e);
-        }
-        if (logger.isDebugEnabled())
-            logger.debug("job running...");
-
-        String hisId = quartzJobHistoryService.createAndInsertHistory(id);
-        Map<String, Object> var = getVar();
-        var.put("context", context);
-        ExecuteResult result = engine.execute(scriptId, var);
-        String strRes;
-        if (logger.isDebugEnabled())
-            logger.debug("job end...{} ", result.isSuccess() ? "success" : "fail");
-        if (result.isSuccess()) {
-            Object res = result.getResult();
-            if (res instanceof String)
-                strRes = ((String) res);
-            else strRes = JSON.toJSONString(res);
-            quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.SUCCESS);
-        } else {
-            if (result.getException() != null) {
-                strRes = StringUtils.throwable2String(result.getException());
-                logger.error("job failed", result.getException());
+            if (logger.isDebugEnabled())
+                logger.debug("job running...");
+            String hisId = quartzJobHistoryService.createAndInsertHistory(id);
+            Map<String, Object> var = getVar();
+            var.put("context", context);
+            ExecuteResult result = engine.execute(scriptId, var);
+            String strRes;
+            if (logger.isDebugEnabled())
+                logger.debug("job end...{} ", result.isSuccess() ? "success" : "fail");
+            if (result.isSuccess()) {
+                Object res = result.getResult();
+                if (res instanceof String)
+                    strRes = ((String) res);
+                else strRes = JSON.toJSONString(res);
+                quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.SUCCESS);
             } else {
-                strRes = result.getMessage();
-                logger.error("job failed {}", strRes);
+                if (result.getException() != null) {
+                    strRes = StringUtils.throwable2String(result.getException());
+                    logger.error("job failed", result.getException());
+                } else {
+                    strRes = result.getMessage();
+                    logger.error("job failed {}", strRes);
+                }
+                quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.FAIL);
             }
-            quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.FAIL);
+        } finally {
+            WebUtil.removeCurrentUser();
         }
     }
 
@@ -115,4 +125,8 @@ public class SimpleJob implements Job {
         if (defaultVar == null) return new HashMap<>();
         return new HashMap<>(defaultVar);
     }
+
+    public void setDefaultUser(User defaultUser) {
+        this.defaultUser = defaultUser;
+    }
 }

+ 21 - 1
hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/quartz/SimpleJobFactory.java

@@ -17,14 +17,19 @@
 package org.hsweb.web.service.impl.quartz;
 
 import org.hsweb.commons.ClassUtils;
+import org.hsweb.web.bean.po.user.User;
 import org.hsweb.web.core.authorize.ExpressionScopeBean;
+import org.hsweb.web.service.config.ConfigService;
 import org.hsweb.web.service.quartz.QuartzJobHistoryService;
 import org.hsweb.web.service.quartz.QuartzJobService;
+import org.hsweb.web.service.user.UserService;
 import org.quartz.Job;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.spi.JobFactory;
 import org.quartz.spi.TriggerFiredBundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.Assert;
 
@@ -36,7 +41,7 @@ import java.util.Map;
 public class SimpleJobFactory implements JobFactory {
 
     public static final String QUARTZ_ID_KEY = "quartz.id";
-
+    protected           Logger logger        = LoggerFactory.getLogger(this.getClass());
     @Resource
     private QuartzJobService quartzJobService;
 
@@ -45,6 +50,12 @@ public class SimpleJobFactory implements JobFactory {
 
     private JobFactory defaultFactory;
 
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private ConfigService configService;
+
     @Autowired(required = false)
     private Map<String, ExpressionScopeBean> expressionScopeBeanMap;
 
@@ -57,6 +68,15 @@ public class SimpleJobFactory implements JobFactory {
             Assert.notNull(id);
             try {
                 SimpleJob job = (SimpleJob) jobClass.getConstructor(QuartzJobService.class, QuartzJobHistoryService.class).newInstance(quartzJobService, quartzJobHistoryService);
+                String username = configService.get("quartz", "executeUserName", "admin");
+                User user = userService.selectByUserName(username);
+                if (user != null) {
+                    user.initRoleInfo();
+                    job.setDefaultUser(user);
+                } else {
+                    //未找到用户名
+                    logger.warn("job executor user:{} not found!", username);
+                }
                 if (expressionScopeBeanMap != null)
                     job.setDefaultVar(new HashMap<>(expressionScopeBeanMap));
                 return job;

+ 14 - 4
hsweb-web-service/hsweb-web-service-simple/src/test/java/org/hsweb/web/service/impl/quartz/QuartzJobServiceImplTest.java

@@ -17,8 +17,11 @@
 package org.hsweb.web.service.impl.quartz;
 
 import org.hsweb.web.bean.po.quartz.QuartzJob;
+import org.hsweb.web.bean.po.user.User;
+import org.hsweb.web.core.utils.WebUtil;
 import org.hsweb.web.service.impl.AbstractTestCase;
 import org.hsweb.web.service.quartz.QuartzJobService;
+import org.hsweb.web.service.user.UserService;
 import org.junit.Test;
 import org.springframework.stereotype.Component;
 
@@ -33,22 +36,29 @@ public class QuartzJobServiceImplTest extends AbstractTestCase {
     @Resource
     private QuartzJobService quartzJobService;
 
+    @Resource
+    private UserService userService;
     static final String jobId = "test";
 
     @Test
     public void testJob() throws InterruptedException {
+        User user = new User();
+        user.setName("admin");
+        user.setUsername("admin");
+        user.setPassword("admin");
+        userService.insert(user);
         quartzJobService.delete(jobId);
         QuartzJob job = new QuartzJob();
         job.setId(jobId);
         job.setName("测试任务");
         job.setCron("0/2 * * * * ?");
         job.setLanguage("groovy");
-        job.setScript("println('任务执行中...');return 'aaaaa';");
+        job.setScript("println('任务执行中...'+(org.hsweb.web.core.utils.WebUtil.getLoginUser())); return 'aaaaa';");
         quartzJobService.insert(job);
         Thread.sleep(20 * 1000);
-        job.setCron("0/5 * * * * ?");
-        job.setScript("println('任务执行中22222...');return 'aaaaa';");
-        quartzJobService.update(job);
+//        job.setCron("0/5 * * * * ?");
+//        job.setScript("println('任务执行中22222...');return 'aaaaa';");
+//        quartzJobService.update(job);
         Thread.sleep(10 * 1000);
         quartzJobService.disable(job.getId());
         Thread.sleep(10 * 1000);