Skip to content

Commit 45e625b

Browse files
committed
增加current-user,解决在定时任务等非http请求的情况下,定义user
1 parent fc3add1 commit 45e625b

File tree

4 files changed

+103
-49
lines changed

4 files changed

+103
-49
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,24 @@ public static User getLoginUser(HttpSession session) {
5454
return null;
5555
}
5656

57+
public static User setCurrentUser(User user) {
58+
ThreadLocalUtils.put("current-user", user);
59+
return user;
60+
}
61+
62+
public static void removeCurrentUser() {
63+
ThreadLocalUtils.remove("current-user");
64+
}
65+
66+
5767
/**
5868
* 在HttpServletRequest中获取当前登录的用户
5969
*
6070
* @param request HttpServletRequest
6171
* @return 当前登录的用户
6272
*/
6373
public static User getLoginUser(HttpServletRequest request) {
64-
if (request == null) return null;
74+
if (request == null) return ThreadLocalUtils.get("current-user");
6575
HttpSession session = request.getSession(false);
6676
if (session == null) {
6777
OAuth2Manager manager = OAuth2ManagerHolder.getManager();

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

Lines changed: 57 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
import org.hsweb.expands.script.engine.ScriptContext;
2626
import org.hsweb.web.bean.po.quartz.QuartzJob;
2727
import org.hsweb.web.bean.po.quartz.QuartzJobHistory;
28+
import org.hsweb.web.bean.po.user.User;
29+
import org.hsweb.web.core.utils.WebUtil;
2830
import org.hsweb.web.service.quartz.QuartzJobHistoryService;
2931
import org.hsweb.web.service.quartz.QuartzJobService;
32+
import org.hsweb.web.service.user.UserService;
3033
import org.quartz.*;
3134
import org.slf4j.Logger;
3235
import org.slf4j.LoggerFactory;
@@ -41,6 +44,7 @@ public class SimpleJob implements Job {
4144
protected QuartzJobService quartzJobService;
4245
protected QuartzJobHistoryService quartzJobHistoryService;
4346
protected Map<String, Object> defaultVar;
47+
protected User defaultUser;
4448

4549
/**
4650
* 子类必须实现此构造方法,否则无法创建任务
@@ -55,55 +59,61 @@ public SimpleJob(QuartzJobService quartzJobService, QuartzJobHistoryService hist
5559

5660
@Override
5761
public void execute(JobExecutionContext context) throws JobExecutionException {
58-
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
59-
String id = jobDataMap.getString(SimpleJobFactory.QUARTZ_ID_KEY);
60-
Assert.notNull(id, "定时任务ID错误");
61-
QuartzJob job = quartzJobService.selectByPk(id);
62-
Assert.notNull(job, "任务不存在");
63-
if (logger.isDebugEnabled())
64-
logger.debug("start job [{}],data : {}", job.getName(), jobDataMap);
65-
DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(job.getLanguage());
66-
String scriptId = "quartz.job.".concat(id);
62+
//初始化用户信息
6763
try {
68-
if (!engine.compiled(scriptId)) {
69-
engine.compile(scriptId, job.getScript());
70-
} else {
71-
ScriptContext scriptContext = engine.getContext(scriptId);
72-
//脚本发生了变化,自动重新编译
73-
if (!MD5.defaultEncode(job.getScript()).equals(scriptContext.getMd5())) {
74-
if (logger.isDebugEnabled())
75-
logger.debug("script is changed,recompile....");
64+
//解决定时任务获取当前用户
65+
WebUtil.setCurrentUser(defaultUser);
66+
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
67+
String id = jobDataMap.getString(SimpleJobFactory.QUARTZ_ID_KEY);
68+
Assert.notNull(id, "定时任务ID错误");
69+
QuartzJob job = quartzJobService.selectByPk(id);
70+
Assert.notNull(job, "任务不存在");
71+
if (logger.isDebugEnabled())
72+
logger.debug("start job [{}],data : {}", job.getName(), jobDataMap);
73+
DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(job.getLanguage());
74+
String scriptId = "quartz.job.".concat(id);
75+
try {
76+
if (!engine.compiled(scriptId)) {
7677
engine.compile(scriptId, job.getScript());
78+
} else {
79+
ScriptContext scriptContext = engine.getContext(scriptId);
80+
//脚本发生了变化,自动重新编译
81+
if (!MD5.defaultEncode(job.getScript()).equals(scriptContext.getMd5())) {
82+
if (logger.isDebugEnabled())
83+
logger.debug("script is changed,recompile....");
84+
engine.compile(scriptId, job.getScript());
85+
}
7786
}
87+
} catch (Exception e) {
88+
throw new JobExecutionException("编译任务脚本失败", e);
7889
}
79-
} catch (Exception e) {
80-
throw new JobExecutionException("编译任务脚本失败", e);
81-
}
82-
if (logger.isDebugEnabled())
83-
logger.debug("job running...");
84-
85-
String hisId = quartzJobHistoryService.createAndInsertHistory(id);
86-
Map<String, Object> var = getVar();
87-
var.put("context", context);
88-
ExecuteResult result = engine.execute(scriptId, var);
89-
String strRes;
90-
if (logger.isDebugEnabled())
91-
logger.debug("job end...{} ", result.isSuccess() ? "success" : "fail");
92-
if (result.isSuccess()) {
93-
Object res = result.getResult();
94-
if (res instanceof String)
95-
strRes = ((String) res);
96-
else strRes = JSON.toJSONString(res);
97-
quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.SUCCESS);
98-
} else {
99-
if (result.getException() != null) {
100-
strRes = StringUtils.throwable2String(result.getException());
101-
logger.error("job failed", result.getException());
90+
if (logger.isDebugEnabled())
91+
logger.debug("job running...");
92+
String hisId = quartzJobHistoryService.createAndInsertHistory(id);
93+
Map<String, Object> var = getVar();
94+
var.put("context", context);
95+
ExecuteResult result = engine.execute(scriptId, var);
96+
String strRes;
97+
if (logger.isDebugEnabled())
98+
logger.debug("job end...{} ", result.isSuccess() ? "success" : "fail");
99+
if (result.isSuccess()) {
100+
Object res = result.getResult();
101+
if (res instanceof String)
102+
strRes = ((String) res);
103+
else strRes = JSON.toJSONString(res);
104+
quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.SUCCESS);
102105
} else {
103-
strRes = result.getMessage();
104-
logger.error("job failed {}", strRes);
106+
if (result.getException() != null) {
107+
strRes = StringUtils.throwable2String(result.getException());
108+
logger.error("job failed", result.getException());
109+
} else {
110+
strRes = result.getMessage();
111+
logger.error("job failed {}", strRes);
112+
}
113+
quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.FAIL);
105114
}
106-
quartzJobHistoryService.endHistory(hisId, strRes, QuartzJobHistory.Status.FAIL);
115+
} finally {
116+
WebUtil.removeCurrentUser();
107117
}
108118
}
109119

@@ -115,4 +125,8 @@ public Map<String, Object> getVar() {
115125
if (defaultVar == null) return new HashMap<>();
116126
return new HashMap<>(defaultVar);
117127
}
128+
129+
public void setDefaultUser(User defaultUser) {
130+
this.defaultUser = defaultUser;
131+
}
118132
}

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,19 @@
1717
package org.hsweb.web.service.impl.quartz;
1818

1919
import org.hsweb.commons.ClassUtils;
20+
import org.hsweb.web.bean.po.user.User;
2021
import org.hsweb.web.core.authorize.ExpressionScopeBean;
22+
import org.hsweb.web.service.config.ConfigService;
2123
import org.hsweb.web.service.quartz.QuartzJobHistoryService;
2224
import org.hsweb.web.service.quartz.QuartzJobService;
25+
import org.hsweb.web.service.user.UserService;
2326
import org.quartz.Job;
2427
import org.quartz.Scheduler;
2528
import org.quartz.SchedulerException;
2629
import org.quartz.spi.JobFactory;
2730
import org.quartz.spi.TriggerFiredBundle;
31+
import org.slf4j.Logger;
32+
import org.slf4j.LoggerFactory;
2833
import org.springframework.beans.factory.annotation.Autowired;
2934
import org.springframework.util.Assert;
3035

@@ -36,7 +41,7 @@
3641
public class SimpleJobFactory implements JobFactory {
3742

3843
public static final String QUARTZ_ID_KEY = "quartz.id";
39-
44+
protected Logger logger = LoggerFactory.getLogger(this.getClass());
4045
@Resource
4146
private QuartzJobService quartzJobService;
4247

@@ -45,6 +50,12 @@ public class SimpleJobFactory implements JobFactory {
4550

4651
private JobFactory defaultFactory;
4752

53+
@Resource
54+
private UserService userService;
55+
56+
@Resource
57+
private ConfigService configService;
58+
4859
@Autowired(required = false)
4960
private Map<String, ExpressionScopeBean> expressionScopeBeanMap;
5061

@@ -57,6 +68,15 @@ public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws Schedul
5768
Assert.notNull(id);
5869
try {
5970
SimpleJob job = (SimpleJob) jobClass.getConstructor(QuartzJobService.class, QuartzJobHistoryService.class).newInstance(quartzJobService, quartzJobHistoryService);
71+
String username = configService.get("quartz", "executeUserName", "admin");
72+
User user = userService.selectByUserName(username);
73+
if (user != null) {
74+
user.initRoleInfo();
75+
job.setDefaultUser(user);
76+
} else {
77+
//未找到用户名
78+
logger.warn("job executor user:{} not found!", username);
79+
}
6080
if (expressionScopeBeanMap != null)
6181
job.setDefaultVar(new HashMap<>(expressionScopeBeanMap));
6282
return job;

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
package org.hsweb.web.service.impl.quartz;
1818

1919
import org.hsweb.web.bean.po.quartz.QuartzJob;
20+
import org.hsweb.web.bean.po.user.User;
21+
import org.hsweb.web.core.utils.WebUtil;
2022
import org.hsweb.web.service.impl.AbstractTestCase;
2123
import org.hsweb.web.service.quartz.QuartzJobService;
24+
import org.hsweb.web.service.user.UserService;
2225
import org.junit.Test;
2326
import org.springframework.stereotype.Component;
2427

@@ -33,22 +36,29 @@ public class QuartzJobServiceImplTest extends AbstractTestCase {
3336
@Resource
3437
private QuartzJobService quartzJobService;
3538

39+
@Resource
40+
private UserService userService;
3641
static final String jobId = "test";
3742

3843
@Test
3944
public void testJob() throws InterruptedException {
45+
User user = new User();
46+
user.setName("admin");
47+
user.setUsername("admin");
48+
user.setPassword("admin");
49+
userService.insert(user);
4050
quartzJobService.delete(jobId);
4151
QuartzJob job = new QuartzJob();
4252
job.setId(jobId);
4353
job.setName("测试任务");
4454
job.setCron("0/2 * * * * ?");
4555
job.setLanguage("groovy");
46-
job.setScript("println('任务执行中...');return 'aaaaa';");
56+
job.setScript("println('任务执行中...'+(org.hsweb.web.core.utils.WebUtil.getLoginUser())); return 'aaaaa';");
4757
quartzJobService.insert(job);
4858
Thread.sleep(20 * 1000);
49-
job.setCron("0/5 * * * * ?");
50-
job.setScript("println('任务执行中22222...');return 'aaaaa';");
51-
quartzJobService.update(job);
59+
// job.setCron("0/5 * * * * ?");
60+
// job.setScript("println('任务执行中22222...');return 'aaaaa';");
61+
// quartzJobService.update(job);
5262
Thread.sleep(10 * 1000);
5363
quartzJobService.disable(job.getId());
5464
Thread.sleep(10 * 1000);

0 commit comments

Comments
 (0)