commit 978a998be4a6b13bd2e624a2d4517665a503eab3 Author: zengwei Date: Thu Sep 2 11:32:37 2021 +0800 init diff --git a/admin/xxl-job-admin部署.md b/admin/xxl-job-admin部署.md new file mode 100644 index 0000000..fb8d107 --- /dev/null +++ b/admin/xxl-job-admin部署.md @@ -0,0 +1,41 @@ +# xxl-job-admin部署文档 +## 代码下载 +使用gitee托管下载更快 +```shell script +git clone https://gitee.com/xuxueli0323/xxl-job.git +``` +## 配置说明 +进xxl-job项目根目录,找到相关配置文件:application.properties +配置文件目录为:xxl-job/xxl-job-admin/src/main/resources +主要对以下项做修改: +```properties +### web 服务器启动的端口和根路径 +server.port=80 +server.servlet.context-path=/xxl-job-admin + +### xxl-job, datasource 数据库配置 +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai +spring.datasource.username=root +spring.datasource.password=keep + +### xxl-job, email ,xxl-job 本身出错发送的邮件 +spring.mail.host=smtp.qq.com +spring.mail.port=25 +spring.mail.username=27447985@qq.com +spring.mail.password=123456 + +### xxl-job, access token , 简易的访问token +xxl.job.accessToken= +``` +## 代码打包 +切换到根目录执行 +```shell script +mvn clean install +``` +## 代码部署 +打包完毕后拷贝jar包:xxl-job-admin-2.3.0.jar +目录为 xxl-job/xxl-job-admin/target +执行 +```shell script +nohup java -jar xxl-job-admin-2.3.0.jar >/dev/null 2>&1 & +``` diff --git a/db/xxl_job.sql b/db/xxl_job.sql new file mode 100644 index 0000000..0c07998 --- /dev/null +++ b/db/xxl_job.sql @@ -0,0 +1,121 @@ +# +# XXL-JOB v2.3.0 +# Copyright (c) 2015-present, xuxueli. + +CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci; +use `xxl_job`; + +SET NAMES utf8mb4; + +CREATE TABLE `xxl_job_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job_group` int(11) NOT NULL COMMENT '执行器主键ID', + `job_desc` varchar(255) NOT NULL, + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `author` varchar(64) DEFAULT NULL COMMENT '作者', + `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', + `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型', + `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型', + `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略', + `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', + `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略', + `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', + `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext COMMENT 'GLUE源代码', + `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注', + `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间', + `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔', + `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行', + `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间', + `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `job_group` int(11) NOT NULL COMMENT '执行器主键ID', + `job_id` int(11) NOT NULL COMMENT '任务,主键ID', + `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址', + `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2', + `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', + `trigger_code` int(11) NOT NULL COMMENT '调度-结果', + `trigger_msg` text COMMENT '调度-日志', + `handle_time` datetime DEFAULT NULL COMMENT '执行-时间', + `handle_code` int(11) NOT NULL COMMENT '执行-状态', + `handle_msg` text COMMENT '执行-日志', + `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败', + PRIMARY KEY (`id`), + KEY `I_trigger_time` (`trigger_time`), + KEY `I_handle_code` (`handle_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_log_report` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间', + `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量', + `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量', + `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_logglue` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job_id` int(11) NOT NULL COMMENT '任务,主键ID', + `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext COMMENT 'GLUE源代码', + `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注', + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_registry` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `registry_group` varchar(50) NOT NULL, + `registry_key` varchar(255) NOT NULL, + `registry_value` varchar(255) NOT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_name` varchar(64) NOT NULL COMMENT '执行器AppName', + `title` varchar(12) NOT NULL COMMENT '执行器名称', + `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', + `address_list` text COMMENT '执行器地址列表,多地址逗号分隔', + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(50) NOT NULL COMMENT '账号', + `password` varchar(50) NOT NULL COMMENT '密码', + `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员', + `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', + PRIMARY KEY (`id`), + UNIQUE KEY `i_username` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_lock` ( + `lock_name` varchar(50) NOT NULL COMMENT '锁名称', + PRIMARY KEY (`lock_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' ); +INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', ''); +INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL); +INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock'); + +commit; diff --git a/executor/pom.xml b/executor/pom.xml new file mode 100644 index 0000000..78ebbf3 --- /dev/null +++ b/executor/pom.xml @@ -0,0 +1,46 @@ + + + + gitlink-notification-system + com.gitlink.notification + 1.0.0 + + executor + 1.0.0 + executer + jar + api + 4.0.0 + + + + org.springframework.boot + spring-boot-starter-web + ${springboot.version} + + + + + com.xuxueli + xxl-job-core + 2.3.0 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + + \ No newline at end of file diff --git a/executor/src/main/java/com/gitlink/notification/executor/ExecutorApplication.java b/executor/src/main/java/com/gitlink/notification/executor/ExecutorApplication.java new file mode 100644 index 0000000..1844f8f --- /dev/null +++ b/executor/src/main/java/com/gitlink/notification/executor/ExecutorApplication.java @@ -0,0 +1,10 @@ +package com.gitlink.notification.executor; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ExecutorApplication { + public static void main(String[] args) { + SpringApplication.run(ExecutorApplication.class, args);} +} diff --git a/executor/src/main/java/com/gitlink/notification/executor/core/config/XXLJobConfig.java b/executor/src/main/java/com/gitlink/notification/executor/core/config/XXLJobConfig.java new file mode 100644 index 0000000..64d3cf9 --- /dev/null +++ b/executor/src/main/java/com/gitlink/notification/executor/core/config/XXLJobConfig.java @@ -0,0 +1,54 @@ +package com.gitlink.notification.executor.core.config; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class XXLJobConfig { + private Logger logger = LoggerFactory.getLogger(XXLJobConfig.class); + + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${xxl.job.executor.appname}") + private String appname; + + @Value("${xxl.job.executor.address}") + private String address; + + @Value("${xxl.job.executor.ip}") + private String ip; + + @Value("${xxl.job.executor.port}") + private int port; + + @Value("${xxl.job.executor.logpath}") + private String logPath; + + @Value("${xxl.job.executor.logretentiondays}") + private int logRetentionDays; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname); + xxlJobSpringExecutor.setAddress(address); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + + return xxlJobSpringExecutor; + } +} diff --git a/executor/src/main/java/com/gitlink/notification/executor/service/jobhandler/SampleXXLJob.java b/executor/src/main/java/com/gitlink/notification/executor/service/jobhandler/SampleXXLJob.java new file mode 100644 index 0000000..bfffad9 --- /dev/null +++ b/executor/src/main/java/com/gitlink/notification/executor/service/jobhandler/SampleXXLJob.java @@ -0,0 +1,250 @@ +package com.gitlink.notification.executor.service.jobhandler; + +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +/** + * XxlJob开发示例(Bean模式) + * + * 开发步骤: + * 1、任务开发:在Spring Bean实例中,开发Job方法; + * 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 + * 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志; + * 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果; + * + */ +@Component +public class SampleXXLJob { + private static Logger logger = LoggerFactory.getLogger(SampleXXLJob.class); + + + /** + * 1、简单任务示例(Bean模式) + */ + @XxlJob("demoJobHandler") + public void demoJobHandler() throws Exception { + XxlJobHelper.log("XXL-JOB, Hello World."); + + for (int i = 0; i < 5; i++) { + XxlJobHelper.log("beat at:" + i); + TimeUnit.SECONDS.sleep(2); + } + // default success + } + + + /** + * 2、分片广播任务 + */ + @XxlJob("shardingJobHandler") + public void shardingJobHandler() throws Exception { + + // 分片参数 + int shardIndex = XxlJobHelper.getShardIndex(); + int shardTotal = XxlJobHelper.getShardTotal(); + + XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal); + + // 业务逻辑 + for (int i = 0; i < shardTotal; i++) { + if (i == shardIndex) { + XxlJobHelper.log("第 {} 片, 命中分片开始处理", i); + } else { + XxlJobHelper.log("第 {} 片, 忽略", i); + } + } + + } + + + /** + * 3、命令行任务 + */ + @XxlJob("commandJobHandler") + public void commandJobHandler() throws Exception { + String command = XxlJobHelper.getJobParam(); + int exitValue = -1; + + BufferedReader bufferedReader = null; + try { + // command process + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.command(command); + processBuilder.redirectErrorStream(true); + + Process process = processBuilder.start(); + //Process process = Runtime.getRuntime().exec(command); + + BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream()); + bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream)); + + // command log + String line; + while ((line = bufferedReader.readLine()) != null) { + XxlJobHelper.log(line); + } + + // command exit + process.waitFor(); + exitValue = process.exitValue(); + } catch (Exception e) { + XxlJobHelper.log(e); + } finally { + if (bufferedReader != null) { + bufferedReader.close(); + } + } + + if (exitValue == 0) { + // default success + } else { + XxlJobHelper.handleFail("command exit value("+exitValue+") is failed"); + } + + } + + + /** + * 4、跨平台Http任务 + * 参数示例: + * "url: http://www.baidu.com\n" + + * "method: get\n" + + * "data: content\n"; + */ + @XxlJob("httpJobHandler") + public void httpJobHandler() throws Exception { + + // param parse + String param = XxlJobHelper.getJobParam(); + if (param==null || param.trim().length()==0) { + XxlJobHelper.log("param["+ param +"] invalid."); + + XxlJobHelper.handleFail(); + return; + } + + String[] httpParams = param.split("\n"); + String url = null; + String method = null; + String data = null; + for (String httpParam: httpParams) { + if (httpParam.startsWith("url:")) { + url = httpParam.substring(httpParam.indexOf("url:") + 4).trim(); + } + if (httpParam.startsWith("method:")) { + method = httpParam.substring(httpParam.indexOf("method:") + 7).trim().toUpperCase(); + } + if (httpParam.startsWith("data:")) { + data = httpParam.substring(httpParam.indexOf("data:") + 5).trim(); + } + } + + // param valid + if (url==null || url.trim().length()==0) { + XxlJobHelper.log("url["+ url +"] invalid."); + + XxlJobHelper.handleFail(); + return; + } + if (method==null || !Arrays.asList("GET", "POST").contains(method)) { + XxlJobHelper.log("method["+ method +"] invalid."); + + XxlJobHelper.handleFail(); + return; + } + boolean isPostMethod = method.equals("POST"); + + // request + HttpURLConnection connection = null; + BufferedReader bufferedReader = null; + try { + // connection + URL realUrl = new URL(url); + connection = (HttpURLConnection) realUrl.openConnection(); + + // connection setting + connection.setRequestMethod(method); + connection.setDoOutput(isPostMethod); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setReadTimeout(5 * 1000); + connection.setConnectTimeout(3 * 1000); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8"); + + // do connection + connection.connect(); + + // data + if (isPostMethod && data!=null && data.trim().length()>0) { + DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream()); + dataOutputStream.write(data.getBytes("UTF-8")); + dataOutputStream.flush(); + dataOutputStream.close(); + } + + // valid StatusCode + int statusCode = connection.getResponseCode(); + if (statusCode != 200) { + throw new RuntimeException("Http Request StatusCode(" + statusCode + ") Invalid."); + } + + // result + bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); + StringBuilder result = new StringBuilder(); + String line; + while ((line = bufferedReader.readLine()) != null) { + result.append(line); + } + String responseMsg = result.toString(); + + XxlJobHelper.log(responseMsg); + + return; + } catch (Exception e) { + XxlJobHelper.log(e); + + XxlJobHelper.handleFail(); + return; + } finally { + try { + if (bufferedReader != null) { + bufferedReader.close(); + } + if (connection != null) { + connection.disconnect(); + } + } catch (Exception e2) { + XxlJobHelper.log(e2); + } + } + + } + + /** + * 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑; + */ + @XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy") + public void demoJobHandler2() throws Exception { + XxlJobHelper.log("XXL-JOB, Hello World."); + } + public void init(){ + logger.info("init"); + } + public void destroy(){ + logger.info("destory"); + } +} diff --git a/executor/src/main/resources/application.properties b/executor/src/main/resources/application.properties new file mode 100644 index 0000000..4585a00 --- /dev/null +++ b/executor/src/main/resources/application.properties @@ -0,0 +1,17 @@ +server.port=8083 +logging.config=classpath:logback.xml +### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin +### xxl-job, access token +xxl.job.accessToken= +### xxl-job executor appname +xxl.job.executor.appname=xxl-job-executor-trustie-sample +### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null +xxl.job.executor.address= +### xxl-job executor server-info +xxl.job.executor.ip= +xxl.job.executor.port=82 +### xxl-job executor log-path +xxl.job.executor.logpath=./log/xxl-job/jobhandler +### xxl-job executor log-retention-days +xxl.job.executor.logretentiondays=30 diff --git a/executor/src/main/resources/logback.xml b/executor/src/main/resources/logback.xml new file mode 100644 index 0000000..a9d5a01 --- /dev/null +++ b/executor/src/main/resources/logback.xml @@ -0,0 +1,29 @@ + + + + logback + + + + + %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/model/pom.xml b/model/pom.xml new file mode 100644 index 0000000..1aac255 --- /dev/null +++ b/model/pom.xml @@ -0,0 +1,15 @@ + + + + gitlink-notifaction-system + com.gitlink.notifaction + 1.0.0 + + 4.0.0 + + model + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..600d075 --- /dev/null +++ b/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + com.gitlink.notification + gitlink-notification-system + pom + 1.0.0 + + model + writer + reader + executor + + + + 1.0.0 + 1.8 + + true + UTF-8 + UTF-8 + 2.3.4.RELEASE + + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.9.6 + + + com.github.xiaoymin + knife4j-discovery-spring-boot-starter + 1.0 + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.5 + + + + \ No newline at end of file diff --git a/reader/pom.xml b/reader/pom.xml new file mode 100644 index 0000000..2c20178 --- /dev/null +++ b/reader/pom.xml @@ -0,0 +1,38 @@ + + + + gitlink-notification-system + com.gitlink.notification + 1.0.0 + + reader + 1.0.0 + reader + jar + api + 4.0.0 + + + + org.springframework.boot + spring-boot-starter-web + ${springboot.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + + \ No newline at end of file diff --git a/reader/src/main/java/com/gitlink/notification/ReaderApiApplication.java b/reader/src/main/java/com/gitlink/notification/ReaderApiApplication.java new file mode 100644 index 0000000..a299104 --- /dev/null +++ b/reader/src/main/java/com/gitlink/notification/ReaderApiApplication.java @@ -0,0 +1,11 @@ +package com.gitlink.notification; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ReaderApiApplication { + public static void main(String[] args) { + SpringApplication.run(ReaderApiApplication.class, args); + } +} diff --git a/reader/src/main/java/com/gitlink/notification/reader/config/SwaggerConfig.java b/reader/src/main/java/com/gitlink/notification/reader/config/SwaggerConfig.java new file mode 100644 index 0000000..05e288b --- /dev/null +++ b/reader/src/main/java/com/gitlink/notification/reader/config/SwaggerConfig.java @@ -0,0 +1,32 @@ +package com.gitlink.notification.reader.config; + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableKnife4j +@Import({BeanValidatorPluginsConfiguration.class}) +public class SwaggerConfig { + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.gitlink.notification")).paths(PathSelectors.any()).build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder().title("GITLINK-API").description("gitlink读取消息API").termsOfServiceUrl("").version("1.0").build(); + } +} diff --git a/reader/src/main/java/com/gitlink/notification/reader/controller/IndexController.java b/reader/src/main/java/com/gitlink/notification/reader/controller/IndexController.java new file mode 100644 index 0000000..8f8142d --- /dev/null +++ b/reader/src/main/java/com/gitlink/notification/reader/controller/IndexController.java @@ -0,0 +1,12 @@ +package com.gitlink.notification.reader.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class IndexController { + @GetMapping(value = "") + public String index() { + return "reader index!"; + } +} diff --git a/reader/src/main/resources/application.yml b/reader/src/main/resources/application.yml new file mode 100644 index 0000000..78fcdc0 --- /dev/null +++ b/reader/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8080 \ No newline at end of file diff --git a/writer/pom.xml b/writer/pom.xml new file mode 100644 index 0000000..16e0cfd --- /dev/null +++ b/writer/pom.xml @@ -0,0 +1,38 @@ + + + + gitlink-notification-system + com.gitlink.notification + 1.0.0 + + + writer + 1.0.0 + writer + jar + api + 4.0.0 + + + + org.springframework.boot + spring-boot-starter-web + ${springboot.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + \ No newline at end of file diff --git a/writer/src/main/java/com/gitlink/notification/WriterApiApplication.java b/writer/src/main/java/com/gitlink/notification/WriterApiApplication.java new file mode 100644 index 0000000..564a870 --- /dev/null +++ b/writer/src/main/java/com/gitlink/notification/WriterApiApplication.java @@ -0,0 +1,11 @@ +package com.gitlink.notification; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WriterApiApplication { + public static void main(String[] args) { + SpringApplication.run(WriterApiApplication.class, args); + } +} diff --git a/writer/src/main/java/com/gitlink/notification/writer/config/SwaggerConfig.java b/writer/src/main/java/com/gitlink/notification/writer/config/SwaggerConfig.java new file mode 100644 index 0000000..7c51173 --- /dev/null +++ b/writer/src/main/java/com/gitlink/notification/writer/config/SwaggerConfig.java @@ -0,0 +1,32 @@ +package com.gitlink.notification.writer.config; + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableKnife4j +@Import({BeanValidatorPluginsConfiguration.class}) +public class SwaggerConfig { + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.gitlink.notification")).paths(PathSelectors.any()).build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder().title("GITLINK-API").description("gitlink读取消息API").termsOfServiceUrl("").version("1.0").build(); + } +} diff --git a/writer/src/main/java/com/gitlink/notification/writer/controller/IndexController.java b/writer/src/main/java/com/gitlink/notification/writer/controller/IndexController.java new file mode 100644 index 0000000..acbce89 --- /dev/null +++ b/writer/src/main/java/com/gitlink/notification/writer/controller/IndexController.java @@ -0,0 +1,13 @@ +package com.gitlink.notification.writer.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class IndexController { + + @GetMapping(value = "") + public String index() { + return "writer index!"; + } +} diff --git a/writer/src/main/resources/application.yml b/writer/src/main/resources/application.yml new file mode 100644 index 0000000..c09df25 --- /dev/null +++ b/writer/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8082 \ No newline at end of file