From 066d39344aa26903596a6335b2ee520c60298a6f Mon Sep 17 00:00:00 2001 From: youys <1272586223@qq.com> Date: Wed, 19 Jan 2022 19:05:41 +0800 Subject: [PATCH] update --- pom.xml | 6 ++ .../educoder/ecsonar/EcsonarApplication.java | 2 + .../educoder/ecsonar/config/RequestAop.java | 76 +++++++++++++++++++ .../ecsonar/config/ThreadPoolConfig.java | 4 +- .../ecsonar/config/WebMvcConfiguration.java | 5 +- .../educoder/ecsonar/constant/Constant.java | 8 +- .../controller/QualityInspectController.java | 12 ++- .../ecsonar/dao/TaskInfoDetailDao.java | 6 +- .../ecsonar/model/TaskInfoDetail.java | 9 +++ .../model/api/QualityInspectResultData.java | 13 ++++ .../model/vo/QualityInspectUserDataVO.java | 17 ++++- .../ecsonar/model/vo/QualityInspectVO.java | 8 +- .../services/QualityInspectService.java | 2 + .../ecsonar/services/SonarService.java | 12 +-- .../ecsonar/task/QualityInspectRunnable.java | 4 + .../ecsonar/utils/ResponseResult.java | 2 +- src/main/resources/application.properties | 13 +++- 17 files changed, 171 insertions(+), 28 deletions(-) create mode 100644 src/main/java/net/educoder/ecsonar/config/RequestAop.java diff --git a/pom.xml b/pom.xml index acabb25..62f400a 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,12 @@ test + + org.springframework.boot + spring-boot-starter-aop + + + com.alibaba druid-spring-boot-starter diff --git a/src/main/java/net/educoder/ecsonar/EcsonarApplication.java b/src/main/java/net/educoder/ecsonar/EcsonarApplication.java index 4554952..c7ad01f 100644 --- a/src/main/java/net/educoder/ecsonar/EcsonarApplication.java +++ b/src/main/java/net/educoder/ecsonar/EcsonarApplication.java @@ -3,7 +3,9 @@ package net.educoder.ecsonar; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +@EnableAspectJAutoProxy @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class EcsonarApplication { diff --git a/src/main/java/net/educoder/ecsonar/config/RequestAop.java b/src/main/java/net/educoder/ecsonar/config/RequestAop.java new file mode 100644 index 0000000..40c780c --- /dev/null +++ b/src/main/java/net/educoder/ecsonar/config/RequestAop.java @@ -0,0 +1,76 @@ +package net.educoder.ecsonar.config; + +import com.alibaba.fastjson.JSONObject; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Enumeration; + +/** + * @author youys + * @data 2019/8/13 + * @description 请求日志打印 + */ +@Aspect +@Component +public class RequestAop { + + private Logger log = LoggerFactory.getLogger(RequestAop.class); + /** + * 声明一个切点,controller包下和子包下的所有类所有方法 + */ + @Pointcut("execution(* net.educoder.ecsonar.controller.*.*(..))") + public void pointCut() { + } + + @Around("pointCut()") + public Object pintLog(ProceedingJoinPoint pjp) throws Throwable { + Long startTime = System.currentTimeMillis(); + + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = requestAttributes.getRequest(); + String requestUrl = request.getRequestURL().toString(); + + // 打印请求内容 + log.info("|===============请求内容 start ==============================|"); + log.info("|请求地址:" + requestUrl); + log.info("|请求方式:" + request.getMethod()); + log.info("|请求类方法:" + pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName()); + + //获取所有参数 + Enumeration enu = request.getParameterNames(); + StringBuilder params = new StringBuilder("【"); + while (enu.hasMoreElements()) { + String paraName = enu.nextElement(); + params.append(paraName).append("=").append(request.getParameter(paraName)).append(";"); + } + params.append("】"); + log.info("|请求方法参数:" + params.toString()); + + Enumeration headersEnu = request.getHeaderNames(); + StringBuilder headersParams = new StringBuilder("【"); + while (headersEnu.hasMoreElements()) { + String headerName = headersEnu.nextElement(); + headersParams.append(headerName).append("=").append(request.getHeader(headerName)).append(";"); + } + headersParams.append("】"); + + log.info("|请求Header信息:{}", headersParams.toString()); + log.info("|===============请求内容 end ================================|"); + + Object result = pjp.proceed(); + long endTime = System.currentTimeMillis(); + + log.info("调用方法: {},返回结果response==>>{}", requestUrl, JSONObject.toJSONString(result)); + log.info("调用方法: {},请求耗时==>> {} ms", requestUrl, endTime - startTime); + return result; + } +} \ No newline at end of file diff --git a/src/main/java/net/educoder/ecsonar/config/ThreadPoolConfig.java b/src/main/java/net/educoder/ecsonar/config/ThreadPoolConfig.java index 79afd87..1c91efe 100644 --- a/src/main/java/net/educoder/ecsonar/config/ThreadPoolConfig.java +++ b/src/main/java/net/educoder/ecsonar/config/ThreadPoolConfig.java @@ -14,7 +14,7 @@ public class ThreadPoolConfig { @Primary public ExecutorService sonarScannerPool() { ThreadFactory sonarScannerPool = new CustomizableThreadFactory("sonarScanner-pool-"); - return new ThreadPoolExecutor(10, 10, 60, + return new ThreadPoolExecutor(20, 20, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10000), sonarScannerPool, new ThreadPoolExecutor.AbortPolicy()); } @@ -23,7 +23,7 @@ public class ThreadPoolConfig { @Bean("sonarQueryResultPool") public ExecutorService queryResultPool() { ThreadFactory sonarQueryResultPool = new CustomizableThreadFactory("sonarQueryResult-pool-"); - return new ThreadPoolExecutor(5, 10, 60, + return new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10000), sonarQueryResultPool, new ThreadPoolExecutor.AbortPolicy()); diff --git a/src/main/java/net/educoder/ecsonar/config/WebMvcConfiguration.java b/src/main/java/net/educoder/ecsonar/config/WebMvcConfiguration.java index d649d87..500f0e3 100644 --- a/src/main/java/net/educoder/ecsonar/config/WebMvcConfiguration.java +++ b/src/main/java/net/educoder/ecsonar/config/WebMvcConfiguration.java @@ -1,12 +1,9 @@ package net.educoder.ecsonar.config; -import com.alibaba.fastjson.serializer.SerializerFeature; -import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.ArrayList; @@ -45,6 +42,6 @@ public class WebMvcConfiguration implements WebMvcConfigurer { supportedMediaTypes.add(MediaType.TEXT_XML); fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes); - converters.add(0,fastJsonHttpMessageConverter); + converters.add(0, fastJsonHttpMessageConverter); } } diff --git a/src/main/java/net/educoder/ecsonar/constant/Constant.java b/src/main/java/net/educoder/ecsonar/constant/Constant.java index 1a6294e..51f9e2b 100644 --- a/src/main/java/net/educoder/ecsonar/constant/Constant.java +++ b/src/main/java/net/educoder/ecsonar/constant/Constant.java @@ -11,10 +11,10 @@ import java.util.List; public class Constant { - public static final String JAVA = "JAVA"; - public static final String C = "C"; - public static final String CXX = "C++"; - public static final String PYTHON = "PYTHON"; + public static final String JAVA = "java"; + public static final String C = "c"; + public static final String CXX = "cpp"; + public static final String PYTHON = "python"; public static final List language = Arrays.asList(JAVA, C, CXX, PYTHON); } diff --git a/src/main/java/net/educoder/ecsonar/controller/QualityInspectController.java b/src/main/java/net/educoder/ecsonar/controller/QualityInspectController.java index f6a3725..675d6e8 100644 --- a/src/main/java/net/educoder/ecsonar/controller/QualityInspectController.java +++ b/src/main/java/net/educoder/ecsonar/controller/QualityInspectController.java @@ -1,10 +1,12 @@ package net.educoder.ecsonar.controller; +import com.alibaba.fastjson.JSONArray; import net.educoder.ecsonar.constant.Constant; import net.educoder.ecsonar.model.RollPage; import net.educoder.ecsonar.model.api.QualityInspect; import net.educoder.ecsonar.model.api.QualityInspectIsCompleted; import net.educoder.ecsonar.model.api.QualityInspectResultData; +import net.educoder.ecsonar.model.vo.QualityInspectUserDataVO; import net.educoder.ecsonar.model.vo.QualityInspectVO; import net.educoder.ecsonar.services.QualityInspectService; import net.educoder.ecsonar.utils.ResponseResult; @@ -12,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * @Author: youys * @Date: 2022/1/17 @@ -32,7 +36,13 @@ public class QualityInspectController { */ @RequestMapping(value = "qualityInspect", method = RequestMethod.POST) @ResponseBody - public ResponseResult qualityInspect(@RequestBody QualityInspectVO qualityInspectVO){ + public ResponseResult qualityInspect(@RequestParam String language, + @RequestParam String homeworkId, + @RequestParam String userDatas){ + + List userDataVOList = JSONArray.parseArray(userDatas,QualityInspectUserDataVO.class); + + QualityInspectVO qualityInspectVO = new QualityInspectVO(language, homeworkId, userDataVOList); if (!Constant.language.contains(qualityInspectVO.getLanguage())) { return ResponseResult.error("不支持的语言"); } diff --git a/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java b/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java index 23c82aa..fc69287 100644 --- a/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java +++ b/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java @@ -20,7 +20,7 @@ public interface TaskInfoDetailDao { * * @param taskInfoDetail */ - @Insert("insert into task_info_detail(id,task_id,project_name,student_id,name,code_ids) values(#{id},#{taskId},#{projectName},#{studentId},#{name},#{codeIds})") + @Insert("insert into task_info_detail(id,task_id,project_name,student_id,user_id,name,code_ids) values(#{id},#{taskId},#{projectName},#{studentId},#{userId} ,#{name},#{codeIds})") void insertTaskInfoDetail(TaskInfoDetail taskInfoDetail); /** @@ -47,7 +47,7 @@ public interface TaskInfoDetailDao { * @param id * @return */ - @Select("select id,task_id taskId,project_name projectName,student_id studentId,name,code_ids codeIds,status,create_time createTime,update_time updateTime from task_info_detail where id=#{id}") + @Select("select id,task_id taskId,project_name projectName,student_id studentId,user_id userId,name,code_ids codeIds,status,create_time createTime,update_time updateTime from task_info_detail where id=#{id}") TaskInfoDetail selectById(String id); /** @@ -69,6 +69,6 @@ public interface TaskInfoDetailDao { * @param position * @return */ - @Select("select id,task_id taskId,project_name projectName,student_id studentId,name,code_ids codeIds,status,create_time createTime,update_time updateTime from task_info_detail where task_id=#{taskId} limit #{pageSize} offset #{position}") + @Select("select id,task_id taskId,project_name projectName,student_id studentId,user_id userId,name,code_ids codeIds,status,create_time createTime,update_time updateTime from task_info_detail where task_id=#{taskId} limit #{pageSize} offset #{position}") List selectTaskInfoDetailPageList(@Param("taskId") String taskId, @Param("pageSize") Integer pageSize, @Param("position") Integer position); } diff --git a/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java b/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java index 9da4ed2..1f34deb 100644 --- a/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java +++ b/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java @@ -13,6 +13,7 @@ public class TaskInfoDetail { private String taskId; private String projectName; private String studentId; + private Long userId; private String name; private String codeIds; /** @@ -55,6 +56,14 @@ public class TaskInfoDetail { this.studentId = studentId; } + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + public String getName() { return name; } diff --git a/src/main/java/net/educoder/ecsonar/model/api/QualityInspectResultData.java b/src/main/java/net/educoder/ecsonar/model/api/QualityInspectResultData.java index 78d1d58..22da559 100644 --- a/src/main/java/net/educoder/ecsonar/model/api/QualityInspectResultData.java +++ b/src/main/java/net/educoder/ecsonar/model/api/QualityInspectResultData.java @@ -18,6 +18,11 @@ public class QualityInspectResultData { */ private String studentId; + /** + * 用户id + */ + private Long userId; + /** * 姓名 */ @@ -67,6 +72,14 @@ public class QualityInspectResultData { this.studentId = studentId; } + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + public String getName() { return name; } diff --git a/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java b/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java index 069ed63..978560b 100644 --- a/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java +++ b/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java @@ -1,5 +1,6 @@ package net.educoder.ecsonar.model.vo; +import java.io.Serializable; import java.util.List; /** @@ -7,12 +8,18 @@ import java.util.List; * @Date: 2022/1/17 * @Description: */ -public class QualityInspectUserDataVO { +public class QualityInspectUserDataVO implements Serializable { /** * 学号 */ private String studentId; + + /** + * 用户id + */ + private Long userId; + /** * 姓名 */ @@ -46,4 +53,12 @@ public class QualityInspectUserDataVO { public void setCodeIds(List codeIds) { this.codeIds = codeIds; } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } } diff --git a/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectVO.java b/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectVO.java index c8f9866..1005759 100644 --- a/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectVO.java +++ b/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectVO.java @@ -1,5 +1,6 @@ package net.educoder.ecsonar.model.vo; +import java.io.Serializable; import java.util.List; /** @@ -7,12 +8,17 @@ import java.util.List; * @Date: 2022/1/17 * @Description: */ -public class QualityInspectVO { +public class QualityInspectVO implements Serializable { private String language; private String homeworkId; private List userDatas; + public QualityInspectVO(String language, String homeworkId, List userDatas) { + this.language = language; + this.homeworkId = homeworkId; + this.userDatas = userDatas; + } public String getLanguage() { return language; diff --git a/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java b/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java index 1879b4c..0058eaa 100644 --- a/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java +++ b/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java @@ -89,6 +89,7 @@ public class QualityInspectService { taskInfoDetail.setProjectName(String.format("%s-%s", qualityInspectVO.getHomeworkId(), userData.getStudentId())); taskInfoDetail.setName(userData.getName()); taskInfoDetail.setStudentId(userData.getStudentId()); + taskInfoDetail.setUserId(userData.getUserId()); taskInfoDetail.setCodeIds(userData.getCodeIds().toString()); taskInfoDetailDao.insertTaskInfoDetail(taskInfoDetail); @@ -130,6 +131,7 @@ public class QualityInspectService { QualityInspectResultData resultData = new QualityInspectResultData(); resultData.setName(taskInfoDetail.getName()); resultData.setStudentId(taskInfoDetail.getStudentId()); + resultData.setUserId(taskInfoDetail.getUserId()); Metrics metrics = reportService.getMetrics(taskInfoDetail.getProjectName()); diff --git a/src/main/java/net/educoder/ecsonar/services/SonarService.java b/src/main/java/net/educoder/ecsonar/services/SonarService.java index 01564c5..4fadce7 100644 --- a/src/main/java/net/educoder/ecsonar/services/SonarService.java +++ b/src/main/java/net/educoder/ecsonar/services/SonarService.java @@ -42,8 +42,8 @@ public class SonarService { @Value("${sonar.url}") String sonarUrl; - @Value("${sonar.token}") - String sonarToken; +// @Value("${sonar.token}") +// String sonarToken; @Value("${extract.path}") String extractProgramPath; @@ -60,7 +60,6 @@ public class SonarService { "-Dsonar.host.url=" + sonarUrl + " " + "-Dsonar.sourceEncoding=utf-8 " + "-Dsonar.projectKey=" + param.getProjectKey() + " " + - "-Dsonar.login=" + sonarToken + " " + "-Dsonar.java.binaries=./ " + "-Dsonar.projectBaseDir=" + param.getProjectPath(); @@ -71,7 +70,6 @@ public class SonarService { "-Dsonar.host.url=" + sonarUrl + " " + "-Dsonar.sourceEncoding=utf-8 " + "-Dsonar.projectKey=" + param.getProjectKey() + " " + - "-Dsonar.login=" + sonarToken + " " + "-Dsonar.projectBaseDir=" + param.getProjectPath(); SystemUtil.executeAndGetExitStatus(command); @@ -82,7 +80,6 @@ public class SonarService { "-Dsonar.host.url=" + sonarUrl + " " + "-Dsonar.sourceEncoding=utf-8 " + "-Dsonar.projectKey=" + param.getProjectKey() + " " + - "-Dsonar.login=" + sonarToken + " " + "-Dsonar.cxx.cppcheck.reportPath=" + param.getCppCheckReportPath() + " " + "-Dsonar.projectBaseDir=" + param.getProjectPath(); SystemUtil.executeAndGetExitStatus(command); @@ -93,10 +90,10 @@ public class SonarService { "-Dsonar.host.url=" + sonarUrl + " " + "-Dsonar.sourceEncoding=utf-8 " + "-Dsonar.projectKey=" + param.getProjectKey() + " " + - "-Dsonar.login=" + sonarToken + " " + "-Dsonar.cxx.cppcheck.reportPath=" + param.getCppCheckReportPath() + " " + "-Dsonar.projectBaseDir=" + param.getProjectPath(); - SystemUtil.executeAndGetExitStatus(command); + SystemUtil.ExecuteResp executeResp = SystemUtil.executeAndGetExitStatus(command); + log.info("command:{}, result:{}", command, executeResp.getOutput()); }); } @@ -188,7 +185,6 @@ public class SonarService { "-Dsonar.host.url=" + sonarUrl + " " + "-Dsonar.sourceEncoding=utf-8 " + "-Dsonar.projectKey=" + key + " " + - "-Dsonar.login=" + sonarToken + " " + "-Dsonar.java.binaries=./ " + "-Dsonar.projectBaseDir=" + projectPath; log.info("projectPath:{},key:{}, command: {}", projectPath, key, command); diff --git a/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java b/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java index da46db8..339f1b1 100644 --- a/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java +++ b/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java @@ -67,6 +67,10 @@ public class QualityInspectRunnable implements Runnable { } GameCodes gameCodes = dbOperateService.queryGameCodesById(codeId); + if(gameCodes == null){ + LOGGER.error("projectName:{}, game_codes_id:{}找不到对应的学员代码",projectName, codeId); + continue; + } FileUtil.writeString(gameCodes.getCode(), path + gameCodes.getPath(), Charset.forName("UTF-8")); } diff --git a/src/main/java/net/educoder/ecsonar/utils/ResponseResult.java b/src/main/java/net/educoder/ecsonar/utils/ResponseResult.java index b94fa1f..9b29f64 100644 --- a/src/main/java/net/educoder/ecsonar/utils/ResponseResult.java +++ b/src/main/java/net/educoder/ecsonar/utils/ResponseResult.java @@ -29,7 +29,7 @@ public class ResponseResult implements Serializable { } public static ResponseResult success(){ - return new ResponseResult(1,"success"); + return new ResponseResult(0,"success"); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d6f7f95..8f9fc25 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,10 +12,17 @@ spring.datasource.master.password=root spring.datasource.master.driverClassName=org.postgresql.Driver +#### test ###### spring.datasource.readonly.driverClassName=com.mysql.jdbc.Driver -spring.datasource.readonly.url=jdbc:mysql://rm-bp1ht3504joktie83.mysql.rds.aliyuncs.com:3306/educoderweb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false -spring.datasource.readonly.username=readonly -spring.datasource.readonly.password=readonly_20210901 +spring.datasource.readonly.url=jdbc:mysql://rm-bp13v5020p7828r5rso.mysql.rds.aliyuncs.com:3306/preeducoderweb?userSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false +spring.datasource.readonly.username=testeducoder +spring.datasource.readonly.password=TEST@123 + +#### prod ###### +#spring.datasource.readonly.driverClassName=com.mysql.jdbc.Driver +#spring.datasource.readonly.url=jdbc:mysql://rm-bp1ht3504joktie83.mysql.rds.aliyuncs.com:3306/educoderweb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false +#spring.datasource.readonly.username=readonly +#spring.datasource.readonly.password=readonly_20210901 # Hikari will use the above plus the following to setup connection pooling #spring.datasource.type=com.zaxxer.hikari.HikariDataSource