diff --git "a/docs/Saturn\344\273\273\345\212\241\350\260\203\345\272\246\345\271\263\345\217\260-github.png" "b/docs/Saturn\344\273\273\345\212\241\350\260\203\345\272\246\345\271\263\345\217\260-github.png" new file mode 100644 index 000000000..08eb5409e Binary files /dev/null and "b/docs/Saturn\344\273\273\345\212\241\350\260\203\345\272\246\345\271\263\345\217\260-github.png" differ diff --git a/pom.xml b/pom.xml index d4e980fdb..d787e3958 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,10 @@ saturn-console-core saturn-console-old saturn-it - + + + saturn-job-realization + -Dfile.encoding=UTF-8 @@ -54,7 +57,7 @@ 1.12.1.RELEASE 0.2.9 - 1.16.6 + 1.16.14 2.5 1.2.29 @@ -486,7 +489,7 @@ ${project.build.locale} - + org.apache.maven.plugins maven-plugin-plugin @@ -593,14 +596,15 @@ - + + org.apache.maven.plugins maven-javadoc-plugin @@ -611,22 +615,24 @@ ${project.build.sourceEncoding} - + + + + diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/SaturnEnvProperties.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/SaturnEnvProperties.java index f719ff9db..3778b872a 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/SaturnEnvProperties.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/SaturnEnvProperties.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; /** + * 配置文件,以java文件的方式代替properties文件 * @author xiaopeng.he */ public final class SaturnEnvProperties { diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/DisableSwaggerUIController.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/DisableSwaggerUIController.java index c27a57292..c13ec0278 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/DisableSwaggerUIController.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/DisableSwaggerUIController.java @@ -5,12 +5,16 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; /** * Display swagger-ui.html in production. + * -Dspring.profiles.active=development + * 放开 swagger-ui 地址:http://localhost:9998/swagger-ui.html * * @author kfchu */ +//@Profile 标签用于开发、测试、 上线环境的切换 @Profile("!development") @Controller public class DisableSwaggerUIController { diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/AbstractGUIController.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/AbstractGUIController.java index 2a00590ca..7c2dccdbd 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/AbstractGUIController.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/AbstractGUIController.java @@ -22,6 +22,7 @@ import static com.vip.saturn.job.console.exception.SaturnJobConsoleException.*; +// TODO: 2018/8/8 ??? public class AbstractGUIController extends AbstractController { private static final Logger log = LoggerFactory.getLogger(AbstractGUIController.class); diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/ExecutorOverviewController.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/ExecutorOverviewController.java index a6b05f2d0..1a6a816dc 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/ExecutorOverviewController.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/ExecutorOverviewController.java @@ -11,6 +11,8 @@ import com.vip.saturn.job.console.service.ExecutorService; import com.vip.saturn.job.console.utils.PermissionKeys; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import org.slf4j.Logger; @@ -26,9 +28,10 @@ /** * Executor overview related operations. - * + * Executor * @author kfchu */ +@Api(description = "Executor的相关操作接口") @RequestMapping("/console/namespaces/{namespace:.+}/executors") public class ExecutorOverviewController extends AbstractGUIController { @@ -45,6 +48,7 @@ public class ExecutorOverviewController extends AbstractGUIController { * 获取域下所有executor基本信息 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取域下所有executor list总览信息接口") @GetMapping public SuccessResponseEntity getExecutors(final HttpServletRequest request, @PathVariable String namespace, @RequestParam(required = false) String status) throws SaturnJobConsoleException { @@ -59,6 +63,7 @@ public SuccessResponseEntity getExecutors(final HttpServletRequest request, @Pat * 获取executor被分配的作业分片信息 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取executor被分配的作业分片详细信息") @GetMapping(value = "/{executorName}/allocation") public SuccessResponseEntity getExecutorAllocation(final HttpServletRequest request, @PathVariable String namespace, @PathVariable String executorName) throws SaturnJobConsoleException { @@ -69,6 +74,7 @@ public SuccessResponseEntity getExecutorAllocation(final HttpServletRequest requ * 一键重排 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "一键重排(没卵用)") @Audit @PostMapping(value = "/shardAll") public SuccessResponseEntity shardAll(final HttpServletRequest request, @@ -82,6 +88,7 @@ public SuccessResponseEntity shardAll(final HttpServletRequest request, * 摘流量与流量恢复 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "摘流量与流量恢复(有待验证作用)") @Audit @PostMapping(value = "/{executorName}/traffic") public SuccessResponseEntity extractOrRecoverTraffic(final HttpServletRequest request, @@ -97,6 +104,7 @@ public SuccessResponseEntity extractOrRecoverTraffic(final HttpServletRequest re * 批量摘流量与流量恢复 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量摘流量与流量恢复(有待验证作用)") @Audit @PostMapping(value = "/traffic") public SuccessResponseEntity batchExtractOrRecoverTraffic(final HttpServletRequest request, @@ -141,6 +149,7 @@ private void extractOrRecoverTraffic(String namespace, String executorName, Stri * 移除executor */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "移除executor接口") @Audit @DeleteMapping(value = "/{executorName}") public SuccessResponseEntity removeExecutor(final HttpServletRequest request, @@ -157,6 +166,7 @@ public SuccessResponseEntity removeExecutor(final HttpServletRequest request, * 批量移除executor */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量移除executor接口") @Audit @DeleteMapping public SuccessResponseEntity batchRemoveExecutors(final HttpServletRequest request, @@ -201,6 +211,7 @@ private void checkExecutorStatus(String namespace, String executorName, ServerSt * 一键Dump,包括threadump和gc.log。 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "一键Dump,包括threadump和gc.log。(有待验证作用)") @Audit @PostMapping(value = "/{executorName}/dump") public SuccessResponseEntity dump(final HttpServletRequest request, @@ -216,6 +227,8 @@ public SuccessResponseEntity dump(final HttpServletRequest request, * 一键重启。 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + // TODO: 2018/8/8 需要学习一下重启executor做了那些操作 + @ApiOperation(value = "一键重启接口") @Audit @PostMapping(value = "/{executorName}/restart") public SuccessResponseEntity restart(final HttpServletRequest request, diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobAlarmStatisticsController.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobAlarmStatisticsController.java index 3fd37c959..9dcfb03e2 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobAlarmStatisticsController.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobAlarmStatisticsController.java @@ -2,6 +2,7 @@ import javax.annotation.Resource; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -31,6 +32,7 @@ public class JobAlarmStatisticsController extends AbstractGUIController { private AlarmStatisticsService alarmStatisticsService; @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "不正常作业查询接口") @GetMapping(value = "/jobs/{jobName}/isAbnormal") public SuccessResponseEntity isAbnormalJob(@PathVariable String namespace, @PathVariable String jobName) throws SaturnJobConsoleException { diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobOverviewController.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobOverviewController.java index 1dc459324..b02cb8cac 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobOverviewController.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/JobOverviewController.java @@ -10,8 +10,7 @@ import com.vip.saturn.job.console.service.AlarmStatisticsService; import com.vip.saturn.job.console.service.JobService; import com.vip.saturn.job.console.utils.*; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,9 +30,10 @@ /** * Job overview related operations. - * + * job作业操作控制 * @author hebelala */ +@Api(description = "job作业操作相关接口") @RequestMapping("/console/namespaces/{namespace:.+}/jobs") public class JobOverviewController extends AbstractGUIController { @@ -55,10 +55,11 @@ public class JobOverviewController extends AbstractGUIController { * @return 作业细节 */ @ApiResponses(value = { @ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class) }) + @ApiOperation(value = "作业列表接口") @GetMapping public SuccessResponseEntity getJobsWithCondition(final HttpServletRequest request, @PathVariable String namespace, - @RequestParam Map condition, @RequestParam(required = false, defaultValue = "1") int page, - @RequestParam(required = false, defaultValue = "25") int size) throws SaturnJobConsoleException { + @ApiParam(value = "查询参数") @RequestParam Map condition, @RequestParam(required = false, defaultValue = "1") int page, + @RequestParam(required = false, defaultValue = "25") int size) throws SaturnJobConsoleException { if (condition.containsKey(QUERY_CONDITION_STATUS)) { String statusStr = checkAndGetParametersValueAsString(condition, QUERY_CONDITION_STATUS, false); JobStatus jobStatus = JobStatus.getJobStatus(statusStr); @@ -76,6 +77,7 @@ public SuccessResponseEntity getJobsWithCondition(final HttpServletRequest reque * @return 总作业数、启用作业数和异常作业数总数 */ @ApiResponses(value = { @ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class) }) + @ApiOperation(value = "获取域下的总作业数、启用作业数和异常作业数") @GetMapping(value = "/counts") public SuccessResponseEntity countJobsStatus(final HttpServletRequest request, @PathVariable String namespace) { return new SuccessResponseEntity(countJobOverviewVo(namespace)); @@ -87,12 +89,15 @@ public SuccessResponseEntity countJobsStatus(final HttpServletRequest request, @ * @return 全域作业名字 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取域下所有作业的名字") @GetMapping(value = "/names") public SuccessResponseEntity getJobNames(@PathVariable String namespace) throws SaturnJobConsoleException { return new SuccessResponseEntity(jobService.getJobNames(namespace)); } + @ApiResponses(value = { @ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class) }) + @ApiOperation(value = "获取任务的分片状态") @GetMapping(value = "/sharding/status") public SuccessResponseEntity getJobsShardingStatus(@PathVariable String namespace, @RequestParam(required = false) List jobNames) throws SaturnJobConsoleException { @@ -259,6 +264,7 @@ private JobOverviewVo countJobOverviewVo(String namespace) { } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取域名下的分组信息") @GetMapping(value = "/groups") public SuccessResponseEntity getGroups(final HttpServletRequest request, @PathVariable String namespace) throws SaturnJobConsoleException { @@ -269,6 +275,7 @@ public SuccessResponseEntity getGroups(final HttpServletRequest request, @PathVa * 获取该作业依赖的所有作业 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取该作业依赖的所有作业") @GetMapping(value = "/{jobName}/dependency") public SuccessResponseEntity getDependingJobs(final HttpServletRequest request, @PathVariable String namespace, @PathVariable String jobName) throws SaturnJobConsoleException { @@ -277,6 +284,7 @@ public SuccessResponseEntity getDependingJobs(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量获取作业集合的依赖的所有作业") @GetMapping(value = "/dependency") public SuccessResponseEntity batchGetDependingJob(final HttpServletRequest request, @PathVariable String namespace, @RequestParam List jobNames) throws SaturnJobConsoleException { @@ -293,6 +301,7 @@ public SuccessResponseEntity batchGetDependingJob(final HttpServletRequest reque */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) @GetMapping(value = "/{jobName}/beDependedJobs") + @ApiOperation(value = "获取依赖该作业的所有作业") public SuccessResponseEntity getDependedJobs(final HttpServletRequest request, @PathVariable String namespace, @PathVariable String jobName) throws SaturnJobConsoleException { List dependedJobs = jobService.getDependedJobs(namespace, jobName); @@ -300,6 +309,7 @@ public SuccessResponseEntity getDependedJobs(final HttpServletRequest request, @ } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量获取依赖该作业的所有作业") @GetMapping(value = "/beDependedJobs") public SuccessResponseEntity batchGetDependedJobs(final HttpServletRequest request, @PathVariable String namespace, @RequestParam List jobNames) throws SaturnJobConsoleException { @@ -312,17 +322,20 @@ public SuccessResponseEntity batchGetDependedJobs(final HttpServletRequest reque } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "启动作业接口") @Audit @PostMapping(value = "/{jobName}/enable") public SuccessResponseEntity enableJob(final HttpServletRequest request, @AuditParam("namespace") @PathVariable String namespace, @AuditParam("jobName") @PathVariable String jobName) throws SaturnJobConsoleException { + //验证眼熟 assertIsPermitted(PermissionKeys.jobEnable, namespace); jobService.enableJob(namespace, jobName, getCurrentLoginUserName()); return new SuccessResponseEntity(); } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量启动作业接口") @Audit @PostMapping(value = "/enable") public SuccessResponseEntity batchEnableJob(final HttpServletRequest request, @@ -337,6 +350,7 @@ public SuccessResponseEntity batchEnableJob(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "禁用(关闭)作业接口") @Audit @PostMapping(value = "/{jobName}/disable") public SuccessResponseEntity disableJob(final HttpServletRequest request, @@ -348,6 +362,7 @@ public SuccessResponseEntity disableJob(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量禁用(关闭)作业接口") @Audit @PostMapping(value = "/disable") public SuccessResponseEntity batchDisableJob(final HttpServletRequest request, @@ -361,7 +376,16 @@ public SuccessResponseEntity batchDisableJob(final HttpServletRequest request, return new SuccessResponseEntity(); } + /** + * 定时任务删除接口 + * @param request + * @param namespace 域名 + * @param jobName 任务名称 + * @return + * @throws SaturnJobConsoleException + */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "定时作业删除接口") @Audit @DeleteMapping(value = "/{jobName}") public SuccessResponseEntity removeJob(final HttpServletRequest request, @@ -373,6 +397,7 @@ public SuccessResponseEntity removeJob(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "批量定时作业删除接口") @Audit @DeleteMapping public SuccessResponseEntity batchRemoveJob(final HttpServletRequest request, @@ -402,6 +427,7 @@ public SuccessResponseEntity batchRemoveJob(final HttpServletRequest request, * 批量设置作业的优先Executor */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value="批量设置作业的优先Executor") @Audit @PostMapping(value = "/preferExecutors") public SuccessResponseEntity batchSetPreferExecutors(final HttpServletRequest request, @@ -417,6 +443,7 @@ public SuccessResponseEntity batchSetPreferExecutors(final HttpServletRequest re } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "新增作业接口") @Audit @PostMapping(value = "/jobs") public SuccessResponseEntity createJob(final HttpServletRequest request, @@ -428,6 +455,7 @@ public SuccessResponseEntity createJob(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "作业复制接口") @Audit @PostMapping(value = "/{jobNameCopied}/copy") public SuccessResponseEntity copyJob(final HttpServletRequest request, @@ -440,6 +468,7 @@ public SuccessResponseEntity copyJob(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "作业导入接口(仅支持.xls文件导入)") @Audit @PostMapping(value = "/import") public SuccessResponseEntity importJobs(final HttpServletRequest request, @@ -458,6 +487,7 @@ public SuccessResponseEntity importJobs(final HttpServletRequest request, } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "作业导出接口") @Audit @GetMapping(value = "/export") public void exportJobs(final HttpServletRequest request, @AuditParam("namespace") @PathVariable String namespace, @@ -472,6 +502,7 @@ public void exportJobs(final HttpServletRequest request, @AuditParam("namespace" * 获取该作业可选择的优先Executor */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取该作业可选择的优先Executor") @GetMapping(value = "/{jobName}/executors") public SuccessResponseEntity getExecutors(final HttpServletRequest request, @PathVariable String namespace, @PathVariable String jobName) throws SaturnJobConsoleException { diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/RegistryCenterController.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/RegistryCenterController.java index 54073c802..d1b735f82 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/RegistryCenterController.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/controller/gui/RegistryCenterController.java @@ -9,6 +9,8 @@ import com.vip.saturn.job.console.service.NamespaceZkClusterMappingService; import com.vip.saturn.job.console.utils.PermissionKeys; import com.vip.saturn.job.console.utils.SaturnConsoleUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import org.apache.commons.lang3.StringUtils; @@ -20,6 +22,7 @@ import java.util.Collection; import java.util.List; +@Api(description = "注册中心相关操作接口") @RequestMapping("/console") public class RegistryCenterController extends AbstractGUIController { @@ -32,6 +35,7 @@ public class RegistryCenterController extends AbstractGUIController { * 创建域 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "新增域名接口") @Audit @PostMapping(value = "/namespaces") public SuccessResponseEntity createNamespace(@AuditParam("namespace") @RequestParam String namespace, @@ -54,6 +58,7 @@ private NamespaceDomainInfo constructNamespaceDomainInfo(String namespace, Strin * 获取所有域列表 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = " 获取所有域列表接口") @GetMapping(value = "/namespaces/detail") public SuccessResponseEntity queryAllNamespaceInfo() { List namespaceInfoList = Lists.newLinkedList(); @@ -76,6 +81,7 @@ public SuccessResponseEntity queryAllNamespaceInfo() { * 导出指定的namespce */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "导出域名接口") @GetMapping(value = "/namespaces/export") public void exportNamespaceInfo(@RequestParam(required = false) List namespaceList, final HttpServletResponse response) throws SaturnJobConsoleException { @@ -88,6 +94,7 @@ public void exportNamespaceInfo(@RequestParam(required = false) List nam * 刷新注册中心 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = " 刷新注册中心接口") @Audit @RequestMapping(value = "/registryCenter/refresh", method = {RequestMethod.GET, RequestMethod.POST}) public SuccessResponseEntity notifyRefreshRegCenter() throws SaturnJobConsoleException { @@ -112,6 +119,7 @@ private List filterOnlineZkClusters(Collection zkClusters) } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "新增zk集群接口") @Audit @PostMapping(value = "/zkClusters") public SuccessResponseEntity createZkCluster(@AuditParam("zkClusterKey") @RequestParam String zkClusterKey, @@ -123,6 +131,7 @@ public SuccessResponseEntity createZkCluster(@AuditParam("zkClusterKey") @Reques } @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "修改zk集群接口") @Audit @PutMapping(value = "/zkClusters") public SuccessResponseEntity updateZkCluster(@AuditParam("zkClusterKey") @RequestParam String zkClusterKey, @@ -136,6 +145,7 @@ public SuccessResponseEntity updateZkCluster(@AuditParam("zkClusterKey") @Reques * 获取单个或所有zk集群信息 */ @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取单个或所有zk集群信息接口") @GetMapping(value = "/zkClusters") public SuccessResponseEntity getZkClusters(@RequestParam(required = false) String status, @RequestParam(required = false) String zkClusterKey) throws SaturnJobConsoleException { @@ -159,6 +169,7 @@ public SuccessResponseEntity getZkClusters(@RequestParam(required = false) Strin // 域迁移 @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "域名迁移接口") @Audit @PostMapping(value = "/namespaces/zkCluster/migrate") public SuccessResponseEntity migrateZkCluster(@AuditParam("namespaces") @RequestParam String namespaces, @@ -173,6 +184,7 @@ public SuccessResponseEntity migrateZkCluster(@AuditParam("namespaces") @Request // 获取域迁移信息 @ApiResponses(value = {@ApiResponse(code = 200, message = "Success/Fail", response = RequestResult.class)}) + @ApiOperation(value = "获取域迁移信息接口") @GetMapping(value = "/namespaces/zkCluster/migrationStatus") public SuccessResponseEntity getZkClusterMigrationStatus() throws SaturnJobConsoleException { NamespaceMigrationOverallStatus namespaceMigrationOverallStatus = namespaceZkClusterMappingService diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/mybatis/repository/CurrentJobConfigRepository.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/mybatis/repository/CurrentJobConfigRepository.java index 87399e764..77d62d231 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/mybatis/repository/CurrentJobConfigRepository.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/mybatis/repository/CurrentJobConfigRepository.java @@ -39,7 +39,7 @@ int countConfigsByNamespaceWithCondition(@Param("namespace") String namespace, List findConfigNamesByNamespace(@Param("namespace") String namespace); - List findConfigGroupsByNamespace(@Param("namespace") String namespace); + //List findConfigGroupsByNamespace(@Param("namespace") String namespace); JobConfig4DB findConfigByNamespaceAndJobName(@Param("namespace") String namespace, @Param("jobName") String jobName); diff --git a/saturn-console-api/src/main/java/com/vip/saturn/job/console/utils/PermissionKeys.java b/saturn-console-api/src/main/java/com/vip/saturn/job/console/utils/PermissionKeys.java index fcae88c18..8f3f91ae4 100644 --- a/saturn-console-api/src/main/java/com/vip/saturn/job/console/utils/PermissionKeys.java +++ b/saturn-console-api/src/main/java/com/vip/saturn/job/console/utils/PermissionKeys.java @@ -1,6 +1,7 @@ package com.vip.saturn.job.console.utils; /** + * 验证参数的key * @author hebelala */ public class PermissionKeys { diff --git a/saturn-console-api/src/main/resources/mapper/CurrentJobConfigMapper.xml b/saturn-console-api/src/main/resources/mapper/CurrentJobConfigMapper.xml index 91c4a96de..5631e8945 100644 --- a/saturn-console-api/src/main/resources/mapper/CurrentJobConfigMapper.xml +++ b/saturn-console-api/src/main/resources/mapper/CurrentJobConfigMapper.xml @@ -97,7 +97,7 @@ - select count(*) from job_config @@ -125,11 +125,11 @@ - select count(*) from job_config where namespace = #{namespace} and is_enabled = #{isEnabled} - select job_name from job_config diff --git a/saturn-console-web/README.md b/saturn-console-web/README.md index 76452ae1b..1695ebe5e 100644 --- a/saturn-console-web/README.md +++ b/saturn-console-web/README.md @@ -23,10 +23,10 @@ Node4.0以上 #### 如何安装 -* npm:`npm install` or `npm i` +* npm:`cnpm install` or `cnpm i` * yarn: `yarn install` -#### 进入开发模式 +#### 进入开发模 * npm: `npm run dev` * yarn: `yarn dev` @@ -35,7 +35,7 @@ Node4.0以上 如果需要配置不同端口可以在/tasks/conf/app.conf.js的`devPort`里修改为其他端口 -#### 构建生产可用文件 +#### 构建生产可用文件 发布环境运行 * npm: `npm run build` * yarn: `yarn build` diff --git a/saturn-console/src/main/resources/application.properties b/saturn-console/src/main/resources/application.properties index b3728b995..ad6b6ee8b 100644 --- a/saturn-console/src/main/resources/application.properties +++ b/saturn-console/src/main/resources/application.properties @@ -1,5 +1,5 @@ # server -server.port=9088 +server.port=9998 spring.http.encoding.force=true @@ -11,3 +11,7 @@ spring.main.show-banner=true console.version=saturn-dev authorization.enabled.default=false authentication.enabled=false + +#־·,־ logback.xml ʹĬãԶ +saturn.console.log=D://log//saturn//console//log + diff --git a/saturn-console/src/main/resources/configs/jdbc.properties b/saturn-console/src/main/resources/configs/jdbc.properties new file mode 100644 index 000000000..fbd886f73 --- /dev/null +++ b/saturn-console/src/main/resources/configs/jdbc.properties @@ -0,0 +1,5 @@ +#ע⣺properties ϵļύgit +#ע⣺ Springboot propertiesļܶurlusernameƣȡԼ +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/vipshopdb?characterEncoding=utf-8 +spring.datasource.username=root +spring.datasource.password=123456 \ No newline at end of file diff --git a/saturn-console/src/main/resources/context/applicationContext.xml b/saturn-console/src/main/resources/context/applicationContext.xml index 20b0a4dd7..1e3b5c6a7 100644 --- a/saturn-console/src/main/resources/context/applicationContext.xml +++ b/saturn-console/src/main/resources/context/applicationContext.xml @@ -70,5 +70,6 @@ - + + diff --git a/saturn-console/src/main/resources/context/applicationContext_datasource_mysql.xml b/saturn-console/src/main/resources/context/applicationContext_datasource_mysql.xml index 94399cb74..3e8f9a0cb 100644 --- a/saturn-console/src/main/resources/context/applicationContext_datasource_mysql.xml +++ b/saturn-console/src/main/resources/context/applicationContext_datasource_mysql.xml @@ -9,13 +9,15 @@ http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> + - - - + + + + diff --git a/saturn-console/src/main/resources/context/webMvcContext.xml b/saturn-console/src/main/resources/context/webMvcContext.xml index 5a524f084..11d9914a6 100644 --- a/saturn-console/src/main/resources/context/webMvcContext.xml +++ b/saturn-console/src/main/resources/context/webMvcContext.xml @@ -15,6 +15,7 @@ ignore-resource-not-found="true" location="classpath:application.properties"/> + diff --git a/saturn-console/src/main/resources/db/mysql/schema.sql b/saturn-console/src/main/resources/db/mysql/schema.sql index 1bb3b372e..a78a4f8ff 100644 --- a/saturn-console/src/main/resources/db/mysql/schema.sql +++ b/saturn-console/src/main/resources/db/mysql/schema.sql @@ -429,3 +429,6 @@ ALTER TABLE `user_role` ADD KEY `idx_user_role_n_i` (`need_approval`, `is_delete UPDATE `role` SET `role_name`='系统管理', `is_relating_to_namespace`='0' WHERE `role_key`='system_admin'; UPDATE `role` SET `role_name`='域开发管理', `is_relating_to_namespace`='1' WHERE `role_key`='namespace_developer'; UPDATE `role` SET `role_name`='域管理', `is_relating_to_namespace`='1' WHERE `role_key`='namespace_admin'; + + +INSERT INTO `sys_config`(property,value) VALUES ('CONSOLE_ZK_CLUSTER_MAPPING', 'zkdefault:zkdefault'); \ No newline at end of file diff --git a/saturn-core/src/main/java/com/vip/saturn/job/basic/JavaShardingItemCallable.java b/saturn-core/src/main/java/com/vip/saturn/job/basic/JavaShardingItemCallable.java index 9d763dd96..79a469631 100644 --- a/saturn-core/src/main/java/com/vip/saturn/job/basic/JavaShardingItemCallable.java +++ b/saturn-core/src/main/java/com/vip/saturn/job/basic/JavaShardingItemCallable.java @@ -154,7 +154,7 @@ public SaturnJobReturn call() { try { beforeExecution(); - + //todo :学习入口 执行业务逻辑的入口 linj temp = saturnJob.doExecution(jobName, item, itemValue, shardingContext, this); // 在此之后,不能再强制停止本线程 diff --git a/saturn-executor/pom.xml b/saturn-executor/pom.xml index 0752466e1..7f075f0dc 100644 --- a/saturn-executor/pom.xml +++ b/saturn-executor/pom.xml @@ -29,6 +29,8 @@ + + org.apache.maven.plugins maven-jar-plugin diff --git a/saturn-executor/src/test/java/com/vip/saturn/job/executor/JsonParseObjectTest.java b/saturn-executor/src/test/java/com/vip/saturn/job/executor/JsonParseObjectTest.java deleted file mode 100644 index deb304e20..000000000 --- a/saturn-executor/src/test/java/com/vip/saturn/job/executor/JsonParseObjectTest.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.vip.saturn.job.executor; - -import com.vip.saturn.job.SaturnJobReturn; -import com.vip.saturn.job.executor.utils.LogbackListAppender; -import com.vip.saturn.job.shell.ScriptJobRunner; -import com.vip.saturn.job.utils.SystemEnvProperties; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Created by xiaopeng.he on 2016/9/20. - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class JsonParseObjectTest { - - private SaturnJobReturn readSaturnJobReturn(String filepath) throws Exception { - Map envMap = new HashMap<>(); - envMap.put(SystemEnvProperties.NAME_VIP_SATURN_OUTPUT_PATH, this.getClass().getResource(filepath).getFile()); - ScriptJobRunner scriptJobRunner = new ScriptJobRunner(envMap, null, null, null, null); - Method createSaturnJobReturnFileMethod = scriptJobRunner.getClass() - .getDeclaredMethod("createSaturnJobReturnFile"); - createSaturnJobReturnFileMethod.setAccessible(true); - createSaturnJobReturnFileMethod.invoke(scriptJobRunner); - Method readSaturnJobReturnMethod = scriptJobRunner.getClass().getDeclaredMethod("readSaturnJobReturn"); - readSaturnJobReturnMethod.setAccessible(true); - return (SaturnJobReturn) readSaturnJobReturnMethod.invoke(scriptJobRunner); - } - - @Test - public void test_A_normal() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnNormal"); - - SaturnJobReturn expect = new SaturnJobReturn(500, "hello world", 200); - HashMap prop = new HashMap(); - prop.put("key", "value"); - expect.setProp(prop); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - @Test - public void test_B_overFields() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnMoreFields"); - - SaturnJobReturn expect = new SaturnJobReturn(500, "hello world", 200); - HashMap prop = new HashMap(); - prop.put("key", "value"); - expect.setProp(prop); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - /** - * 少errorGroup,默认为200 - */ - @Test - public void test_C_lessFieldErrorGroup() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnLessFieldErrorGroup"); - - SaturnJobReturn expect = new SaturnJobReturn(500, "hello world", 200); - HashMap prop = new HashMap(); - prop.put("key", "value"); - expect.setProp(prop); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - /** - * 少prop,默认为空 - */ - @Test - public void test_D_lessFieldProp() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnLessFieldProp"); - - SaturnJobReturn expect = new SaturnJobReturn(500, "hello world", 200); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - /** - * 少returnCode,默认为0 - */ - @Test - public void test_E_lessFieldReturnCode() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnLessFieldReturnCode"); - - SaturnJobReturn expect = new SaturnJobReturn(0, "hello world", 200); - HashMap prop = new HashMap(); - prop.put("key", "value"); - expect.setProp(prop); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - /** - * 少returnMsg,默认为空 - */ - @Test - public void test_F_lessFieldReturnMsg() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnLessFieldReturnMsg"); - - SaturnJobReturn expect = new SaturnJobReturn(500, null, 200); - HashMap prop = new HashMap(); - prop.put("key", "value"); - expect.setProp(prop); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - /** - * 少全部字段,只有{} - */ - @Test - public void test_G_NoFields() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnNoFields"); - - SaturnJobReturn expect = new SaturnJobReturn(); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - - /** - * 没有内容 - */ - @Test - public void test_H_blank() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnBlank"); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNull(); - } - - @Test - public void test_I_trim() throws Exception { - LogbackListAppender logbackListAppender = new LogbackListAppender(); - logbackListAppender.addToLogger(ScriptJobRunner.class); - logbackListAppender.start(); - - SaturnJobReturn saturnJobReturn = readSaturnJobReturn("/SaturnJobReturnTrim"); - - SaturnJobReturn expect = new SaturnJobReturn(500, "hello world", 200); - HashMap prop = new HashMap(); - prop.put("key", "value"); - expect.setProp(prop); - - assertThat(logbackListAppender.getLastMessage()).isNull(); - assertThat(saturnJobReturn).isNotNull().isEqualToComparingFieldByField(expect); - } - -} diff --git a/saturn-executor/src/test/java/com/vip/saturn/job/executor/utils/LogbackListAppender.java b/saturn-executor/src/test/java/com/vip/saturn/job/executor/utils/LogbackListAppender.java deleted file mode 100644 index ea5636d49..000000000 --- a/saturn-executor/src/test/java/com/vip/saturn/job/executor/utils/LogbackListAppender.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.vip.saturn.job.executor.utils; - -/******************************************************************************* - * Copyright (c) 2005, 2014 springside.github.io - * - * Licensed under the Apache License, Version 2.0 (the "License"); - *******************************************************************************/ - -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.UnsynchronizedAppenderBase; -import org.slf4j.LoggerFactory; - -import java.util.LinkedList; -import java.util.List; - -/** - * 在List中保存日志的Appender, 用于测试Logback的日志输出. - * - * 在测试开始前, 使用任意一种addToLogger()方法将此appender添加到需要侦听的logger中. - * - * @author calvin - */ -public class LogbackListAppender extends UnsynchronizedAppenderBase { - - private final List logs = new LinkedList(); - - public LogbackListAppender() { - start(); - } - - @Override - protected void append(ILoggingEvent e) { - logs.add(e); - } - - /** - * 返回之前append的第一个log. - */ - public ILoggingEvent getFirstLog() { - if (logs.isEmpty()) { - return null; - } - return logs.get(0); - } - - /** - * 返回之前append的第一个log的内容. - */ - public String getFirstMessage() { - if (logs.isEmpty()) { - return null; - } - return getFirstLog().getFormattedMessage(); - } - - /** - * 返回之前append的最后一个log. - */ - public ILoggingEvent getLastLog() { - if (logs.isEmpty()) { - return null; - } - return logs.get(logs.size() - 1); - } - - /** - * 返回之前append的最后一个log的内容. - */ - public String getLastMessage() { - if (logs.isEmpty()) { - return null; - } - return getLastLog().getFormattedMessage(); - } - - /** - * 返回之前append的所有log. - */ - public List getAllLogs() { - return logs; - } - - /** - * 返回Log的数量。 - */ - public int getLogsCount() { - return logs.size(); - } - - /** - * 判断是否有log. - */ - public boolean isEmpty() { - return logs.isEmpty(); - } - - /** - * 清除之前append的所有log. - */ - public void clearLogs() { - logs.clear(); - } - - /** - * 将此appender添加到logger中. - */ - public void addToLogger(String loggerName) { - Logger logger = (Logger) LoggerFactory.getLogger(loggerName); - logger.addAppender(this); - } - - /** - * 将此appender添加到logger中. - */ - public void addToLogger(Class loggerClass) { - Logger logger = (Logger) LoggerFactory.getLogger(loggerClass); - logger.addAppender(this); - } - - /** - * 将此appender添加到root logger中. - */ - public void addToRootLogger() { - Logger logger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); - logger.addAppender(this); - } - - /** - * 将此appender从logger中移除. - */ - public void removeFromLogger(String loggerName) { - Logger logger = (Logger) LoggerFactory.getLogger(loggerName); - logger.detachAppender(this); - } - - /** - * 将此appender从logger中移除. - */ - public void removeFromLogger(Class loggerClass) { - Logger logger = (Logger) LoggerFactory.getLogger(loggerClass); - logger.detachAppender(this); - } - - /** - * 将此appender从root logger中移除. - */ - public void removeFromRootLogger() { - Logger logger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); - logger.detachAppender(this); - } - -} \ No newline at end of file diff --git a/saturn-job-realization/README.md b/saturn-job-realization/README.md new file mode 100644 index 000000000..d4997a8c4 --- /dev/null +++ b/saturn-job-realization/README.md @@ -0,0 +1 @@ +这是一个定时任务的实现工程 diff --git a/saturn-job-realization/pom.xml b/saturn-job-realization/pom.xml new file mode 100644 index 000000000..d29446a29 --- /dev/null +++ b/saturn-job-realization/pom.xml @@ -0,0 +1,73 @@ + + + + saturn-job + com.vip.saturn + master-SNAPSHOT + + 4.0.0 + + saturn-job-realization + + + + com.vip.saturn + saturn-executor + master-SNAPSHOT + + + com.vip.saturn + saturn-job-api + + master-SNAPSHOT + + + org.apache.commons + commons-lang3 + + + com.alibaba + fastjson + + + org.apache.httpcomponents + httpclient + + + + + + + + com.vip.saturn + saturn-plugin + + master-SNAPSHOT + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + src/main/assembly/zip.xml + + + + + assembly + package + + single + + + + + + + + + \ No newline at end of file diff --git a/saturn-job-realization/src/main/assembly/bin/saturn-executor.sh b/saturn-job-realization/src/main/assembly/bin/saturn-executor.sh new file mode 100644 index 000000000..a1b1cefe5 --- /dev/null +++ b/saturn-job-realization/src/main/assembly/bin/saturn-executor.sh @@ -0,0 +1,374 @@ +#!/bin/bash + +ulimit -s 20280 +ulimit -c unlimited +ulimit -n 20480 + +export PATH=$PATH:/usr/sbin + +WORKING_DIR=`pwd` +COMMAND="$0 $*" +PRG_DIRECT="$0" + +#PRG="$0" +PRG=$(readlink -f $0) +PRG_DIR=`dirname "$PRG"` +BASE_DIR=`cd "$PRG_DIR/.." >/dev/null; pwd` +PARENT_DIR=`cd "$BASE_DIR/.." >/dev/null; pwd` + +NAMESPACE="" +EXECUTORNAME=`hostname` +SATURN_LIB_DIR=$BASE_DIR/lib +APP_LIB_DIR=$PARENT_DIR/app +RUN_MODE="background" +JMX_PORT="24501" +RUN_ENVIRONMENT="" +CUSTOM_LOGDIR="" + +TEMP_DIR=${PRG_DIR}/temp +if [ ! -d $TEMP_DIR ]; then + mkdir -p $TEMP_DIR +fi +STATUS_FILE=$TEMP_DIR/status +PID_FILE=$TEMP_DIR/PID +LOGDIR_FILE=$TEMP_DIR/LOGDIR +LAST_START_COMMAND_FILE=$TEMP_DIR/last_start_command.sh + +USAGE() +{ + echo -e "Usage: ${PRG_FILE} start | stop | restart" + echo -e " -------------------------------" + echo -e " start [-n|--namespace namespace] [-e|--executorName executorName] [-jmx|--jmx-port port] [jvmArgs, its position should be the last.]" + echo -e " '-n|--namespace': required." + echo -e " '-e|--executorName': optional,default value is ${EXECUTORNAME}." + echo -e " '-d|--libdir': optional, default value is ${PARENT_DIR}/app." + echo -e " '-r|--runmode': optional, default value is ${RUN_MODE}, you can set it foreground" + echo -e " '-jmx|--jmx-port': optional, default value is ${JMX_PORT}." + echo -e " '-env|--environment': optional." + echo -e " '-sld|--saturnLogDir': optional." + echo -e " jvmArgs: optional." + echo -e " -------------------------------" + echo -e " dump, no parameters." + echo -e " -------------------------------" + echo -e " stop, no parameters." + echo -e " -------------------------------" + echo -e " restart, no parameters." + echo -e " -------------------------------" +} + +if [ $# -lt 1 ]; then + USAGE + exit -1 +fi + +LOG_FMT() +{ + local MSG=$* + echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [saturn-executor] ${MSG}" +} + +CMD="$1" +shift + +while true; do + case "$1" in + -n|--namespace) NAMESPACE="$2"; shift 2;; + -e|--executorName) EXECUTORNAME="$2"; shift 2;; + -d| --libdir) APP_LIB_DIR="$2"; shift 2;; + -r| --runmode) RUN_MODE="$2"; shift 2;; + -jmx|--jmx-port) JMX_PORT="$2" ; shift 2 ;; + -env|--environment) RUN_ENVIRONMENT="$2" ; shift 2 ;; + -sld|--saturnLogDir) CUSTOM_LOGDIR="$2" ; shift 2 ;; + *) break;; + esac +done + +ADDITIONAL_OPTS=$*; + +CHECK_JMX() +{ + if [ x"$JMX_PORT" == x ]; then + JMX_OPTS="" + else + TMP=$(echo `lsof -P -i :${JMX_PORT} | grep LISTEN | awk '{print $2}'`) + if [ x"$TMP" != x ]; then + LOG_FMT "The jmx port is used, please use other port." + exit -1 + fi + LOG_FMT "The jmx port is ${JMX_PORT}." + fi +} + +GET_PID() +{ + if [ -f $PID_FILE ] ; then + cat $PID_FILE + else + echo `ps -ef | grep java | grep "\-jar" | grep "saturn-executor.jar" | grep -v grep | awk '{print $2}' ` + fi +} + +CHECK_PARAMETERS() +{ + if [ x$NAMESPACE == x ]; then + LOG_FMT "The parameter -n|--namespace is required." + USAGE; + exit -1 + fi +} + +STARTUP_DELAY() +{ + STARTUP_DELAY_SECONDS=20 + if [[ "$RUN_ENVIRONMENT" = "production" ]]; then + i=1 + while(($i<=$STARTUP_DELAY_SECONDS)); do + echo -e ".\c" + sleep 1 + i=$(($i+1)) + done + fi +} + +LOG_STARTLOG() +{ + local LOGDIR=`cat $LOGDIR_FILE` + local MSG=$* + echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [saturn-executor] ${MSG}" >> $LOGDIR/saturn-start.log +} + +START() +{ + CHECK_JMX + CHECK_PARAMETERS + + PERM_SIZE="256m" + MAX_PERM_SIZE="512m" + + if [[ "$RUN_ENVIRONMENT" = "dev" ]]; then + ENVIRONMENT_MEM="-Xms512m -Xmx512m -Xss256K" + PERM_SIZE="128m" + MAX_PERM_SIZE="256m" + elif [[ "$RUN_ENVIRONMENT" = "docker" ]]; then + ENVIRONMENT_MEM="-Xms512m -Xmx512m -Xss256K" + PERM_SIZE="128m" + MAX_PERM_SIZE="256m" + else + ENVIRONMENT_MEM="-Xms2048m -Xmx2048m" + fi + + LOGDIR="$CUSTOM_LOGDIR" + if [[ "$LOGDIR" = "" ]]; then + LOCALIP=`ip addr| grep 'inet '| grep -v '127.0.0.1'` + LOCALIP=`echo $LOCALIP | cut -d/ -f1|awk '{print $2}'` + LOGDIR=/apps/logs/saturn/${NAMESPACE}/${EXECUTORNAME}-${LOCALIP} + fi + + OUTFILE=$LOGDIR/saturn-nohup.out + + JAVA_OPTS="-XX:+PrintCommandLineFlags -XX:-OmitStackTraceInFastThrow -XX:-UseBiasedLocking -XX:AutoBoxCacheMax=20000" + MEM_OPTS="-server ${ENVIRONMENT_MEM} -XX:+AlwaysPreTouch" + + CMS_GC_OPTS="-XX:NewRatio=1 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:MaxTenuringThreshold=6 -XX:+ParallelRefProcEnabled -XX:+ExplicitGCInvokesConcurrent" + G1_GC_OPTS="" #place holder for G1 opts + + GCLOG_OPTS="-Xloggc:${LOGDIR}/gc.log -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails" + CRASH_OPTS="-XX:ErrorFile=${LOGDIR}/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/" + JMX_OPTS="-Dcom.sun.management.jmxremote.port=${JMX_PORT} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dsun.rmi.transport.tcp.threadKeepAliveTime=75000 -Djava.rmi.server.hostname=${LOCALIP}" + SETTING_CONF="-DVIP_SATURN_ENABLE_EXEC_SCRIPT=true -DVIP_SATURN_PRG=${PRG} -DVIP_SATURN_LOG_DIR=${LOGDIR} -DVIP_SATURN_LOG_OUTFILE=${OUTFILE} -Dstart.check.outfile=${STATUS_FILE}" + + JAVA_VERSION=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}') + + if [[ "$JAVA_VERSION" < "1.8" ]]; then + MEM_OPTS="$MEM_OPTS -XX:PermSize=${PERM_SIZE} -XX:MaxPermSize=${MAX_PERM_SIZE} -Djava.security.egd=file:/dev/./urandom" + else + MEM_OPTS="$MEM_OPTS -XX:MetaspaceSize=${PERM_SIZE} -XX:MaxMetaspaceSize=${MAX_PERM_SIZE} " + fi + + if [[ $ADDITIONAL_OPTS == *"-XX:+UseG1GC"* ]]; then + GC_OPTS="$G1_GC_OPTS" + else + GC_OPTS="$CMS_GC_OPTS" + fi + + LOG_FMT "Begin to start executor." + LOG_FMT "The java version is ${JAVA_VERSION}" + LOG_FMT "Log redirects to ${LOGDIR}" + + if [ ! -d $LOGDIR ]; then + LOG_FMT "[WARNING] the log directory of $LOGDIR is not existed, try to create it." + mkdir -p $LOGDIR + if [ -d $LOGDIR ]; then + LOG_FMT "Create log directory successfully." + else + LOG_FMT "Create log directory failed." + exit -1 + fi + fi + + if [ -f $PID_FILE ] ; then + PID=`cat $PID_FILE` + fi + + if [ "$PID" != "" ]; then + if [ -d /proc/$PID ];then + LOG_FMT "Saturn executor is running as process:$PID, please stop it first!!" + exit -1 + fi + fi + + # delete nohup.out if possible + if [ -f $OUTFILE ] ; then + rm -rf $OUTFILE + fi + + STARTUP_DELAY + + echo "" > ${STATUS_FILE} + RUN_PARAMS="-namespace ${NAMESPACE} -executorName ${EXECUTORNAME} -saturnLibDir ${SATURN_LIB_DIR} -appLibDir ${APP_LIB_DIR}" + nohup java $JAVA_OPTS $MEM_OPTS $GC_OPTS $JMX_OPTS $GCLOG_OPTS $CRASH_OPTS $SETTING_CONF $ADDITIONAL_OPTS -jar ${BASE_DIR}/saturn-executor.jar ${RUN_PARAMS} >> $OUTFILE 2>&1 & + PID=$! + echo $PID > $PID_FILE + echo $LOGDIR > $LOGDIR_FILE + + #record the start command + echo -e "#!/bin/bash\ncd ${WORKING_DIR}\nchmod +x ${PRG_DIRECT}\n${COMMAND}" > ${LAST_START_COMMAND_FILE} + chmod +x ${LAST_START_COMMAND_FILE} + + LOG_FMT "Starting...\c" + sleep 3 + + CHECK_STATUS=`cat ${STATUS_FILE}` + START_TIME=20 + starttime=0 + while [ x"$CHECK_STATUS" == x ]; do + if [[ "$starttime" -lt ${START_TIME} ]]; then + sleep 1 + ((starttime++)) + echo -e ".\c" + CHECK_STATUS=`cat ${STATUS_FILE}` + else + echo -e "" + LOG_FMT "Saturn executor start may be fail! See ${OUTFILE} for more information." + exit -1 + fi + done + + echo -e "" + + if [ $CHECK_STATUS = "SUCCESS" ]; then + LOG_FMT "Saturn executor start successfully, running as process:$PID." + LOG_STARTLOG "Saturn executor is started, running as process:$PID, parameters are: $RUN_PARAMS" + echo ${RUN_PARAMS} > ${STATUS_FILE} + fi + + if [ $CHECK_STATUS = "ERROR" ]; then + kill -9 $PID + LOG_FMT "Saturn executor start is failed ! See ${OUTFILE} for more information." + exit -1 + fi + + if [[ "$RUN_MODE" = "foreground" ]]; then + trap STOP SIGTERM + wait $PID + fi +} + +DUMP() +{ + LOG_FMT "Begin to dump executor." + if [ -f $LOGDIR_FILE ]; then + LOGDIR=`cat $LOGDIR_FILE` + LOG_FILE_POSTFIX="`date '+%Y-%m-%d-%H%M%S'`" + cp ${LOGDIR}/gc.log ${LOGDIR}/gc_${LOG_FILE_POSTFIX}.log + LOG_FMT "Backup gc log is done: gc_${LOG_FILE_POSTFIX}.log" + + PID=$(GET_PID) + if [ "$PID" != "" ]; then + if [ -d /proc/${PID} ];then + LOG_FMT "Start to do thread dump." + # do the thread dump + LOG_FILE_POSTFIX="${LOG_FILE_POSTFIX}_${PID}" + jstack -l ${PID} > ${LOGDIR}/dump_${LOG_FILE_POSTFIX}.log + LOG_FMT "Thread dump is done: dump_${LOG_FILE_POSTFIX}.log" + else + LOG_FMT "Executor(pid:${PID}) is not running." + fi + else + LOG_FMT "Executor is not running." + fi + else + LOG_FMT "[WARNING] Dump failed as the LOGDIR is not found." + fi +} + +STOP() +{ + LOG_FMT "Begin to stop executor." + DUMP + PID=$(GET_PID) + stoptime=0 + if [ "$PID" != "" ]; then + if [ -d /proc/$PID ];then + RUN_PARAMS=`cat ${STATUS_FILE}` + LOG_FMT "Saturn executor pid is ${PID}, params are : ${RUN_PARAMS}." + LOG_FMT "Stopping...\c" + while [ -d /proc/$PID ]; do + if [[ "$stoptime" -lt 300 ]]; then + kill $PID + sleep 1 + ((stoptime++)) + echo -e ".\c" + else + echo -e "" + LOG_FMT "Stop failed after 300 seconds. now kill -9 ${PID}" + kill -9 $PID + fi + done + echo -e "" + LOG_FMT "Kill the executor process successfully." + LOG_STARTLOG "Saturn executor is stopped." + else + LOG_FMT "Saturn executor with PID:$PID is not running." + fi + else + LOG_FMT "Saturn executor is not running." + fi +} + +RESTART() +{ + STOP + if [ -f ${LAST_START_COMMAND_FILE} ]; then + chmod +x ${LAST_START_COMMAND_FILE} + ${LAST_START_COMMAND_FILE} + else + LOG_FMT "[WARNING] Cannot restart the executor as the ${LAST_START_COMMAND_FILE} is not existing." + fi +} + +STATUS() +{ + if [ -f $PID_FILE ] ; then + PID=`cat $PID_FILE` + fi + if [ "$PID" != "" ] ; then + if [ -d /proc/$PID ] ; then + RUN_PARAMS=`cat ${STATUS_FILE}` + LOG_FMT "Saturn executor with PID:$PID is running, params are : ${RUN_PARAMS}." + exit 0 + fi + fi + LOG_FMT "Saturn executor is not running." +} + + +case "$CMD" in + start) START;; + dump) DUMP;; + stop) STOP;; + restart) RESTART;; + status) STATUS;; + help) USAGE;; + *) USAGE;; +esac diff --git a/saturn-job-realization/src/main/assembly/zip.xml b/saturn-job-realization/src/main/assembly/zip.xml new file mode 100644 index 000000000..d6633fc43 --- /dev/null +++ b/saturn-job-realization/src/main/assembly/zip.xml @@ -0,0 +1,37 @@ + + zip + ${project.build.finalName} + + zip + + + + / + + com.vip.saturn:saturn-executor:* + + ${artifact.artifactId}.${artifact.extension} + + + + /lib + + com.vip.saturn:saturn-executor:* + + + + + + + + src/main/assembly/bin + bin + + + + + + \ No newline at end of file diff --git a/saturn-job-realization/src/main/java/com/hc/saturn/job/LGSimpleJob.java b/saturn-job-realization/src/main/java/com/hc/saturn/job/LGSimpleJob.java new file mode 100644 index 000000000..7445bc3e9 --- /dev/null +++ b/saturn-job-realization/src/main/java/com/hc/saturn/job/LGSimpleJob.java @@ -0,0 +1,82 @@ +package com.hc.saturn.job; + +import com.alibaba.fastjson.JSONObject; +import com.hc.saturn.util.HttpClientUtils; +import com.vip.saturn.job.AbstractSaturnJavaJob; +import com.vip.saturn.job.SaturnJobExecutionContext; +import com.vip.saturn.job.SaturnJobReturn; + +import org.apache.commons.lang3.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 临港的任务执行类 + * todo: 暂时以项目为划分,后期如果项目多了,可以整理以功能划分 + * + * @author linj + */ +public class LGSimpleJob extends AbstractSaturnJavaJob { + + /** + * @param jobName 任务名称 + * @param shardItem 分片 暂时未使用 todo :实现分片进行测试多线程,需要确定分片使用的场景 + * @param shardParam 分片参数 + * @param shardingContext 自定义其他参数 :可以用于具体的业务实现 {} + * @return + * @throws InterruptedException + */ + @Override + public SaturnJobReturn handleJavaJob(final String jobName, final Integer shardItem, final String shardParam, final SaturnJobExecutionContext shardingContext) throws InterruptedException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + System.out.println("《《《:"+sdf.format(new Date())); + switch (shardItem) { + case 0: + System.out.println("《《《:"+sdf.format(new Date())); + //return new SaturnJobReturn("0"); + return singleTask(jobName, shardItem, shardParam, shardingContext); + default: + System.out.println("default"); + return new SaturnJobReturn("default"); + } + /* + //todo :后续需要确定分片使用的场景 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + switch (shardItem){ + case 0 : + System.out.println(sdf.format(new Date())+";"+shardParam); + return new SaturnJobReturn("shardParam"); + case 1 : + System.out.println(sdf.format(new Date())+";"+shardParam); + return new SaturnJobReturn("shardItem:1"); + case 2 : + System.out.println(sdf.format(new Date())+";"+shardParam); + return new SaturnJobReturn("shardItem:2"); + } + return new SaturnJobReturn("null");*/ + } + + /** + * 单分片任务 + * + * @param jobName + * @param shardItem + * @param shardParam + * @param shardingContext + * @return + */ + public SaturnJobReturn singleTask(final String jobName, final Integer shardItem, final String shardParam, final SaturnJobExecutionContext shardingContext) { + if (StringUtils.isNotBlank(shardingContext.getJobParameter())) { + JSONObject jsonObject = JSONObject.parseObject(shardingContext.getJobParameter()); + String url = jsonObject.getString("url"); + String result = HttpClientUtils.doGet(url); + // TODO: 2018/6/25 linj 这里需要模拟elastic job的日志系统,将采集的每次记录保存 + //JSONObject resultJson = JSONObject.parseObject(result); + //记录采集的自定义日志 + // url 、status 、 desc time + return new SaturnJobReturn(result); + } + return new SaturnJobReturn("自定义参数为空"); + } +} diff --git a/saturn-job-realization/src/main/java/com/hc/saturn/util/HttpClientUtils.java b/saturn-job-realization/src/main/java/com/hc/saturn/util/HttpClientUtils.java new file mode 100644 index 000000000..4aa11905c --- /dev/null +++ b/saturn-job-realization/src/main/java/com/hc/saturn/util/HttpClientUtils.java @@ -0,0 +1,167 @@ +package com.hc.saturn.util; + +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.conn.HttpHostConnectException; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: HttpClientUtils + * @Description: HttpClient工具类 + * @version V1.0 + */ +public class HttpClientUtils { + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + int code = response.getStatusLine().getStatusCode(); + if(code == 200) { + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + }else { + resultString = "500"; + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + public static String doGet(String url) { + return doGet(url, null); + } + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + try { + response = httpClient.execute(httpPost); + }catch (HttpHostConnectException e){ + + } + // 判断返回状态是否为200 + if(response != null ){ + int code = response.getStatusLine().getStatusCode(); + if(code == 200) { + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + }else { + resultString = "500"; + } + }else{ + resultString = "500"; + } + + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if(response != null){ + response.close(); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; + } + + //自定义类型的dopost + //public static String + + + + public static String doPost(String url) { + return doPost(url, null); + } + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + System.out.println(resultString); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } +}