Browse Source

modbus

master
zhizhi wu 4 years ago
parent
commit
a06b563988
  1. 8
      ccmq/src/main/java/com/ccsens/ccmq/lowlevel/client/netty/tcphexserver/ModbusConverter.java
  2. 25
      ccmq/src/main/java/com/ccsens/ccmq/lowlevel/client/netty/tcphexserver/ModbusDecoder.java
  3. 6
      ccmq/src/main/java/wiki/tall/ccmq/common/util/WebConstant.java
  4. 2
      pom.xml
  5. 1
      scheduler/README.md
  6. 177
      scheduler/pom.xml
  7. 9
      scheduler/src/main/java/com/ccsens/scheduler/SchedulerApplication.java
  8. 23
      scheduler/src/main/java/com/ccsens/scheduler/config/BeanConfig.java
  9. 73
      scheduler/src/main/java/com/ccsens/scheduler/config/ControllerExceptionHandler.java
  10. 382
      scheduler/src/main/java/com/ccsens/scheduler/config/DruidProps.java
  11. 24
      scheduler/src/main/java/com/ccsens/scheduler/config/MyPropertySourceFactory.java
  12. 38
      scheduler/src/main/java/com/ccsens/scheduler/config/RedisConfig.java
  13. 77
      scheduler/src/main/java/com/ccsens/scheduler/config/ServletConfig.java
  14. 118
      scheduler/src/main/java/com/ccsens/scheduler/config/SpringConfig.java
  15. 55
      scheduler/src/main/java/com/ccsens/scheduler/config/SwaggerConfigure.java
  16. 35
      scheduler/src/main/java/com/ccsens/scheduler/exception/BaseException.java
  17. 158
      scheduler/src/main/java/com/ccsens/scheduler/intercept/MybatisInterceptor.java
  18. 43
      scheduler/src/main/java/com/ccsens/scheduler/util/CodeEnum.java
  19. 594
      scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java
  20. 102
      scheduler/src/main/java/com/ccsens/scheduler/util/JsonResponse.java
  21. 23
      scheduler/src/main/java/com/ccsens/scheduler/util/PropUtil.java
  22. 750
      scheduler/src/main/java/com/ccsens/scheduler/util/RedisUtil.java
  23. 27
      scheduler/src/main/resources/application-common.yml
  24. 22
      scheduler/src/main/resources/application-dev.yml
  25. 22
      scheduler/src/main/resources/application-prod.yml
  26. 24
      scheduler/src/main/resources/application-test.yml
  27. 4
      scheduler/src/main/resources/application.yml
  28. 22
      scheduler/src/main/resources/banner.txt
  29. 33
      scheduler/src/main/resources/druid-dev.yml
  30. 34
      scheduler/src/main/resources/druid-prod.yml
  31. 34
      scheduler/src/main/resources/druid-test.yml
  32. 196
      scheduler/src/main/resources/logback-spring.xml
  33. 68
      scheduler/src/main/resources/mbg.xml
  34. 64
      scheduler/src/main/resources/mybatis/mybatis-config.xml

8
ccmq/src/main/java/com/ccsens/ccmq/lowlevel/client/netty/tcphexserver/ModbusConverter.java

@ -8,7 +8,6 @@ import com.ccsens.ccmq.lowlevel.message.common.InMessage;
import com.ccsens.ccmq.lowlevel.message.common.MessageConstant;
import com.ccsens.ccmq.lowlevel.message.common.OutMessage;
import com.ccsens.ccmq.lowlevel.message.server.ModBusAckMessage;
import com.ccsens.ccmq.lowlevel.message.server.PongMessage;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j;
@ -161,7 +160,7 @@ public class ModbusConverter {
switch (type) {
// 心跳
case Pong:{
ccModBusEntity = fromHeartMessage(JacksonUtil.jsonToBean(outMessage.getData(), PongMessage.class));
ccModBusEntity = fromHeartMessage();
break;
}
// 认证
@ -251,10 +250,9 @@ public class ModbusConverter {
/**
* OriginalData: 0x00
* @param message
* @return
* @return 心跳响应
*/
private static CCModBusEntity fromHeartMessage(PongMessage message){
private static CCModBusEntity fromHeartMessage(){
byte []originData = {};
byte addr = CCModBusEntity.ADDRESS;

25
ccmq/src/main/java/com/ccsens/ccmq/lowlevel/client/netty/tcphexserver/ModbusDecoder.java

@ -7,6 +7,7 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;
import wiki.tall.ccmq.common.bean.dto.ccmodbus.CCModBusEntity;
import wiki.tall.ccmq.common.util.WebConstant;
import java.util.List;
@ -61,6 +62,7 @@ public class ModbusDecoder extends ByteToMessageDecoder {
return;
}
CCModBusEntity ccModBusEntity = new CCModBusEntity(in);
CCModBusEntity.Error error = ccModBusEntity.valid();
log.info("modBus数据检查:{}", error);
@ -82,15 +84,24 @@ public class ModbusDecoder extends ByteToMessageDecoder {
//交给下个handler处理
discardNBytes(in, ccModBusEntity.getModbusLength());
for (int i = 0; i < ccModBusEntity.getModbusData().length ; i++) {
log.info("modBus原始数据"+i + ":" + Integer.toHexString(ccModBusEntity.getModbusData()[i]) +"------" + ccModBusEntity.getModbusData()[i]);
}
// for (int i = 0; i < ccModBusEntity.getModbusData().length ; i++) {
// log.info("modBus原始数据"+i + ":" + Integer.toHexString(ccModBusEntity.getModbusData()[i]) +"------" + ccModBusEntity.getModbusData()[i]);
// }
byte addr = ccModBusEntity.getAddr();
if (addr == WebConstant.SLAVE_ID) {
// 消息系统作为从设备,接收主设备的消息
InMessage message = ModbusConverter.convertCCModbusToMessage(ccModBusEntity);
log.info("modBus封装成inMessage:{}", message);
if (ObjectUtil.isNotNull(message)) {
out.add(message);
}
} else {
// 消息系统作为主设备,接收从设备的返回消息
InMessage message = ModbusConverter.convertCCModbusToMessage(ccModBusEntity);
log.info("modBus封装成inMessage:{}", message);
if (ObjectUtil.isNotNull(message)) {
out.add(message);
}
}
}
}

6
ccmq/src/main/java/wiki/tall/ccmq/common/util/WebConstant.java

@ -5,6 +5,12 @@ import cn.hutool.core.codec.Base64;
import java.io.File;
public class WebConstant {
/***
* TCP协议是作为从设备时的ID
*/
public static final byte SLAVE_ID = 1;
public static final String DYNAMIC_DATASOURCE_SCHEMA_KEY = "${schema}";
public static final String JWT_ACCESS_TOKEN_SECERT = Base64.encode("v%R5jNdmouCN?");
public static final String JWT_REFRESH_TOKEN_SECRET = Base64.encode("GPYTu,tHA\"|/~");

2
pom.xml

@ -9,6 +9,7 @@
<module>eureka</module>
<module>ccmq</module>
<module>histrixmonitor</module>
<module>scheduler</module>
</modules>
<groupId>com.ccsens</groupId>
<artifactId>common</artifactId>
@ -23,6 +24,7 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

1
scheduler/README.md

@ -0,0 +1 @@
调度系统

177
scheduler/pom.xml

@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>common</artifactId>
<groupId>com.ccsens</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>scheduler</artifactId>
<dependencies>
<!--任务调度相关依赖-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.2</version>
</dependency>
<!-- spring Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- spring MongoDB-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- 自动重连-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>mongodb-plus-spring-boot-starter</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
<!-- spring MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--jfinal enjoy 模板引擎-->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>enjoy</artifactId>
<version>4.7</version>
</dependency>
<!-- mybatis pagehelper包-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
<!--mybatis generator包-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- MySQL数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--Durid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.21</version>
</dependency>
<!--jjwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<!--Jackson Xml-->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>
<!--Shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<!--Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<!--Poi Excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
</dependencies>
</project>

9
scheduler/src/main/java/com/ccsens/scheduler/SchedulerApplication.java

@ -0,0 +1,9 @@
package com.ccsens.scheduler;
/**
* @description:
* @author: whj
* @time: 2021/2/20 17:39
*/
public class SchedulerApplication {
}

23
scheduler/src/main/java/com/ccsens/scheduler/config/BeanConfig.java

@ -0,0 +1,23 @@
package com.ccsens.scheduler.config;
import com.ccsens.scheduler.intercept.MybatisInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @description:
* @author: wuHuiJuan
* @create: 2019/12/03 18:01
*/
@Configuration
public class BeanConfig {
/**
* 注册拦截器
*/
@Bean
public MybatisInterceptor mybatisInterceptor() {
MybatisInterceptor interceptor = new MybatisInterceptor();
return interceptor;
}
}

73
scheduler/src/main/java/com/ccsens/scheduler/config/ControllerExceptionHandler.java

@ -0,0 +1,73 @@
package com.ccsens.scheduler.config;
import com.ccsens.scheduler.exception.BaseException;
import com.ccsens.scheduler.util.CodeEnum;
import com.ccsens.scheduler.util.JsonResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
/**
* @author wu
*/
@Slf4j
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseBody
public JsonResponse validateExceptionHandler(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
log.error("MethodArgumentNotValidException",e);
return JsonResponse.newInstance().fail(CodeEnum.PARAM_NULL.getCode(),bindingResult.getFieldError().getDefaultMessage());
}
@ExceptionHandler(value = BindException.class)
@ResponseBody
public JsonResponse handleBindException(BindException e) {
// ex.getFieldError():随机返回一个对象属性的异常信息。如果要一次性返回所有对象属性异常信息,则调用ex.getAllErrors()
FieldError fieldError = e.getFieldError();
StringBuilder sb = new StringBuilder();
sb.append(fieldError.getField()).append("=[").append(fieldError.getRejectedValue()).append("]")
.append(fieldError.getDefaultMessage());
e.printStackTrace();
log.error("BindException", e);
return JsonResponse.newInstance().fail(-11,sb.toString());
}
@ExceptionHandler(value = HttpMessageNotReadableException.class)
@ResponseBody
public JsonResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
e.printStackTrace();
log.error("HttpMessageNotReadableException", e);
return JsonResponse.newInstance().fail(-12,e.getMessage());
}
@ExceptionHandler(value = BaseException.class)
@ResponseBody
public JsonResponse jsonBaseExceptionHandler(HttpServletRequest req, BaseException e) {
e.printStackTrace();
log.error("BaseException",e);
if (e.getCodeEnum() != null) {
return JsonResponse.newInstance().ok(e.getCodeEnum());
}
return JsonResponse.newInstance().fail(e.getCode(),e.getMessage());
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public JsonResponse jsonExceptionHandler(HttpServletRequest req, Exception e) {
e.printStackTrace();
log.error("Exception",e);
return JsonResponse.newInstance().fail(-1,e.getMessage());
}
}

382
scheduler/src/main/java/com/ccsens/scheduler/config/DruidProps.java

@ -0,0 +1,382 @@
package com.ccsens.scheduler.config;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.alibaba.druid.pool.DruidDataSource;
import com.ccsens.scheduler.util.Constant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.SQLException;
@Component
@ConfigurationProperties(prefix="spring.datasource.druid")
@PropertySource(value = {"classpath:druid-${spring.profiles.active}.yml"}, factory = MyPropertySourceFactory.class)
public class DruidProps {
private Logger logger = LoggerFactory.getLogger(DruidProps.class);
private String dynamicUrl;
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private String filters;
private String connectionProperties;
private String logSlowSql;
private String servletName;
private String servletUrlMapping;
private String servletLoginUsername;
private String servletLoginPassword;
private String servletLogSlowSql;
private String servletResetEnable;
private String filterName;
private String filterUrlPattern;
private String filterExclusions;
private String filterProfileEnable;
private String env;
public DataSource createDruidDataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(username);
if (StrUtil.isNotEmpty(password)) {
String key = System.getenv(env);
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, Base64.decode(key));
String decryptStr = aes.decryptStr(password, CharsetUtil.CHARSET_UTF_8);
datasource.setPassword(decryptStr);
} else {
datasource.setPassword("");
}
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter : {0}", e);
e.printStackTrace();
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
public DataSource createDynamicDruidDataSource(String schema) {
DruidDataSource datasource = new DruidDataSource();
String url = dynamicUrl.replace(Constant.DYNAMIC_DATASOURCE_SCHEMA_KEY,schema);
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter : {0}", e);
e.printStackTrace();
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
//----------------------------------------------------
public String getDynamicUrl() {
return dynamicUrl;
}
public void setDynamicUrl(String dynamicUrl) {
this.dynamicUrl = dynamicUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMaxWait() {
return maxWait;
}
public void setMaxWait(int maxWait) {
this.maxWait = maxWait;
}
public int getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public int getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public String getValidationQuery() {
return validationQuery;
}
public void setValidationQuery(String validationQuery) {
this.validationQuery = validationQuery;
}
public boolean isTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public boolean isTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public boolean isPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public int getMaxPoolPreparedStatementPerConnectionSize() {
return maxPoolPreparedStatementPerConnectionSize;
}
public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
public String getConnectionProperties() {
return connectionProperties;
}
public void setConnectionProperties(String connectionProperties) {
this.connectionProperties = connectionProperties;
}
public String getLogSlowSql() {
return logSlowSql;
}
public void setLogSlowSql(String logSlowSql) {
this.logSlowSql = logSlowSql;
}
public String getServletUrlMapping() {
return servletUrlMapping;
}
public void setServletUrlMapping(String servletUrlMapping) {
this.servletUrlMapping = servletUrlMapping;
}
public String getServletLoginUsername() {
return servletLoginUsername;
}
public void setServletLoginUsername(String servletLoginUsername) {
this.servletLoginUsername = servletLoginUsername;
}
public String getServletLoginPassword() {
return servletLoginPassword;
}
public void setServletLoginPassword(String servletLoginPassword) {
this.servletLoginPassword = servletLoginPassword;
}
public String getServletLogSlowSql() {
return servletLogSlowSql;
}
public void setServletLogSlowSql(String servletLogSlowSql) {
this.servletLogSlowSql = servletLogSlowSql;
}
public String getServletResetEnable() {
return servletResetEnable;
}
public void setServletResetEnable(String servletResetEnable) {
this.servletResetEnable = servletResetEnable;
}
public String getServletName() {
return servletName;
}
public void setServletName(String servletName) {
this.servletName = servletName;
}
public String getFilterName() {
return filterName;
}
public void setFilterName(String filterName) {
this.filterName = filterName;
}
public String getFilterUrlPattern() {
return filterUrlPattern;
}
public void setFilterUrlPattern(String filterUrlPattern) {
this.filterUrlPattern = filterUrlPattern;
}
public String getFilterExclusions() {
return filterExclusions;
}
public void setFilterExclusions(String filterExclusions) {
this.filterExclusions = filterExclusions;
}
public String getFilterProfileEnable() {
return filterProfileEnable;
}
public void setFilterProfileEnable(String filterProfileEnable) {
this.filterProfileEnable = filterProfileEnable;
}
public String getEnv() {
return env;
}
public void setEnv(String env) {
this.env = env;
}
}

24
scheduler/src/main/java/com/ccsens/scheduler/config/MyPropertySourceFactory.java

@ -0,0 +1,24 @@
package com.ccsens.scheduler.config;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.IOException;
/**
* @description:
* @author: wuHuiJuan
* @create: 2019/12/02 10:35
*/
public class MyPropertySourceFactory implements PropertySourceFactory {
public MyPropertySourceFactory() {
super();
}
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
return new YamlPropertySourceLoader().load(name, encodedResource.getResource()).get(0);
}
}

38
scheduler/src/main/java/com/ccsens/scheduler/config/RedisConfig.java

@ -0,0 +1,38 @@
package com.ccsens.scheduler.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}

77
scheduler/src/main/java/com/ccsens/scheduler/config/ServletConfig.java

@ -0,0 +1,77 @@
package com.ccsens.scheduler.config;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* 在springboot添加过滤器有两种方式
  1通过创建FilterRegistrationBean的方式
1.1 建议使用此种方式统一管理且通过注解的方式若不是本地调试
如果在filter中需要增加cookie可能会存在写不进前端情况
1.2 有多个filter就创建多个FilterRegistrationBean 若需注明filter的执行顺序
可通过registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1)配置
值越大执行顺序越靠后 
2通过注解@WebFilter的方式
  2.1 在启动类上增加@ServletComponentScan注解自动扫描带有过滤器注解的包
2.2 在类上使用@WebFilter和@Order组合实现
3通过注解@WebFilter的方式
  3.1 在类上使用@WebFilter和@Order组合实现
3.2 在类上添加@Component注解
*/
/**
* 原生方案
* @WebServlet @WebListener@WebFilter
* 在启动类上增加@ServletComponentScan注解自动扫描带有Servlet原生方案注解的包
*
* SpringBoot方案
* SpringBoot提供了三种Bean
* FilterRegistrationBean
* ServletRegistrationBean
* ServletListenerRegistrationBean
* 分别对应配置原生的FilterServletListener
*/
/**
* 注册系统过滤器
*/
@Configuration
public class ServletConfig {
@Resource
private DruidProps druidConfig;
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.setName(druidConfig.getFilterName());
reg.addUrlMappings(druidConfig.getServletUrlMapping());
//白名单:
//reg.addInitParameter("allow","127.0.0.1");
//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
//reg.addInitParameter("deny","192.168.1.73");
reg.addInitParameter("loginUsername", druidConfig.getServletLoginUsername());
reg.addInitParameter("loginPassword", druidConfig.getServletLoginPassword());
reg.addInitParameter("logSlowSql", druidConfig.getServletLogSlowSql());
//是否能够重置数据.
reg.addInitParameter("resetEnable",druidConfig.getServletResetEnable());
return reg;
}
@Bean
public FilterRegistrationBean druidFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.setName(druidConfig.getFilterName());
filterRegistrationBean.addUrlPatterns(druidConfig.getFilterUrlPattern());
filterRegistrationBean.addInitParameter("exclusions", druidConfig.getFilterExclusions());
filterRegistrationBean.addInitParameter("profileEnable", druidConfig.getFilterProfileEnable());
return filterRegistrationBean;
}
}

118
scheduler/src/main/java/com/ccsens/scheduler/config/SpringConfig.java

@ -0,0 +1,118 @@
package com.ccsens.scheduler.config;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.sql.DataSource;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class SpringConfig implements WebMvcConfigurer {
@Autowired
private DruidProps druidPropsUtil;
@Value("${spring.snowflake.workerId}")
private String workerId;
@Value("${spring.snowflake.datacenterId}")
private String datacenterId;
/**
* 配置Converter
* @return
*/
@Bean
public HttpMessageConverter<String> responseStringConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
}
@Bean
public HttpMessageConverter<Object> responseJsonConverter(){
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
List<MediaType> mediaTypeList = new ArrayList<>();
mediaTypeList.add(MediaType.TEXT_HTML);
mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
converter.setSupportedMediaTypes(mediaTypeList);
//converter.setObjectMapper();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
converter.setObjectMapper(objectMapper);
return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(responseStringConverter());
converters.add(responseJsonConverter());
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
/**
* 配置静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:///home/filedeal/uploads/");
}
/**
* 配置数据源单数据源
*/
@Bean
public DataSource dataSource(){
return druidPropsUtil.createDruidDataSource();
}
@Bean
public Snowflake snowflake(){
return IdUtil.createSnowflake(Long.valueOf(workerId),Long.valueOf(datacenterId));
}
}

55
scheduler/src/main/java/com/ccsens/scheduler/config/SwaggerConfigure.java

@ -0,0 +1,55 @@
package com.ccsens.scheduler.config;
import com.ccsens.scheduler.util.Constant;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
@ConditionalOnExpression("${swagger.enable}")
public class SwaggerConfigure {
@Bean
public Docket customDocket() {
//
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors
.basePackage("com.ccsens.scheduler.api"))
.build()
.globalOperationParameters(setHeaderToken());
}
private ApiInfo apiInfo() {
return new ApiInfo("Swagger scheduler",
"This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.",
"1.0.0",
"http://swagger.io/terms/",
"zhangsan",
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0.html"
);
}
private List<Parameter> setHeaderToken() {
ParameterBuilder tokenPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<>();
tokenPar.name(Constant.HEADER_KEY_TOKEN).description("token")
.defaultValue(Constant.HEADER_KEY_TOKEN_PREFIX)
.modelRef(new ModelRef("string")).parameterType("header").required(false).build();
pars.add(tokenPar.build());
return pars;
}
}

35
scheduler/src/main/java/com/ccsens/scheduler/exception/BaseException.java

@ -0,0 +1,35 @@
package com.ccsens.scheduler.exception;
import com.ccsens.scheduler.util.CodeEnum;
import lombok.Getter;
/**
* @author _zhangsan
*/
@Getter
public class BaseException extends RuntimeException {
private Integer code;
private CodeEnum codeEnum;
private String operation;
public BaseException(String message){
super(message);
this.code = -1;
}
public BaseException(Integer code, String message){
super(message);
this.code = code;
}
public BaseException(CodeEnum codeEnum) {
super(codeEnum.getMsg());
this.code = codeEnum.getCode();
this.codeEnum = codeEnum;
}
public BaseException(){
}
}

158
scheduler/src/main/java/com/ccsens/scheduler/intercept/MybatisInterceptor.java

@ -0,0 +1,158 @@
package com.ccsens.scheduler.intercept;
import cn.hutool.core.collection.CollectionUtil;
import com.ccsens.scheduler.util.Constant;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* @description:
* @author: wuHuiJuan
* @create: 2019/12/11 10:58
*/
@Intercepts({
@Signature(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
)
})
public class MybatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
String selectByExample = "selectByExample";
String countByExample = "countByExample";
String countByExample2 = "selectByExample_COUNT";
String selectByPrimaryKey = "selectByPrimaryKey";
Object[] args = invocation.getArgs();
MappedStatement statement = (MappedStatement) args[0];
if (statement.getId().endsWith(selectByExample)
|| statement.getId().endsWith(countByExample)
|| statement.getId().endsWith(countByExample2)) {
//XXXExample
Object example = args[1];
addCondition(statement, example);
} else if (statement.getId().endsWith(selectByPrimaryKey)) {
BoundSql boundSql = statement.getBoundSql(args[1]);
String sql = boundSql.getSql() + " and rec_status = 0";
MappedStatement newStatement = newMappedStatement(statement, new BoundSqlSqlSource(boundSql));
MetaObject msObject = MetaObject.forObject(newStatement, new DefaultObjectFactory(), new DefaultObjectWrapperFactory(),new DefaultReflectorFactory());
msObject.setValue("sqlSource.boundSql.sql", sql);
args[0] = newStatement;
}
return invocation.proceed();
}
private void addCondition(MappedStatement statement, Object example) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
if (example instanceof Map) {
example = ((Map) example).get("_ORIGINAL_PARAMETER_OBJECT");
}
Method method = example.getClass().getMethod("getOredCriteria", null);
//获取到条件数组,第一个是Criteria
List list = (List) method.invoke(example);
if (CollectionUtil.isEmpty(list)) {
Class clazz = ((ResultMap) statement.getResultMaps().get(0)).getType();
String exampleName = clazz.getName() + "Example";
Object paramExample = Class.forName(exampleName).newInstance();
Method createCriteria = paramExample.getClass().getMethod("createCriteria");
Object criteria = createCriteria.invoke(paramExample);
Method andIsDelEqualTo = criteria.getClass().getMethod("andRecStatusEqualTo", Byte.class);
andIsDelEqualTo.invoke(criteria, Constant.REC_STATUS.Normal.value);
list.add(criteria);
} else {
Object criteria = list.get(0);
Method getCriteria = criteria.getClass().getMethod("getCriteria");
List params = (List) getCriteria.invoke(criteria);
boolean hasDel = false;
for (Object param : params) {
Method getCondition = param.getClass().getMethod("getCondition");
Object condition = getCondition.invoke(param);
if ("rec_status =".equals(condition)) {
hasDel = true;
}
}
if (!hasDel) {
Method andIsDelEqualTo = criteria.getClass().getMethod("andRecStatusEqualTo", Byte.class);
andIsDelEqualTo.invoke(criteria, Constant.REC_STATUS.Normal.value);
}
}
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
private MappedStatement newMappedStatement(MappedStatement ms, SqlSource newSqlSource) {
MappedStatement.Builder builder =
new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());
builder.resource(ms.getResource());
builder.fetchSize(ms.getFetchSize());
builder.statementType(ms.getStatementType());
builder.keyGenerator(ms.getKeyGenerator());
if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) {
StringBuilder keyProperties = new StringBuilder();
for (String keyProperty : ms.getKeyProperties()) {
keyProperties.append(keyProperty).append(",");
}
keyProperties.delete(keyProperties.length() - 1, keyProperties.length());
builder.keyProperty(keyProperties.toString());
}
builder.timeout(ms.getTimeout());
builder.parameterMap(ms.getParameterMap());
builder.resultMaps(ms.getResultMaps());
builder.resultSetType(ms.getResultSetType());
builder.cache(ms.getCache());
builder.flushCacheRequired(ms.isFlushCacheRequired());
builder.useCache(ms.isUseCache());
return builder.build();
}
class BoundSqlSqlSource implements SqlSource {
private BoundSql boundSql;
public BoundSqlSqlSource(BoundSql boundSql) {
this.boundSql = boundSql;
}
@Override
public BoundSql getBoundSql(Object parameterObject) {
return boundSql;
}
}
}

43
scheduler/src/main/java/com/ccsens/scheduler/util/CodeEnum.java

@ -0,0 +1,43 @@
package com.ccsens.scheduler.util;
import lombok.Getter;
@Getter
public enum CodeEnum {
/**
* 异常
*/
SUCCESS(200, "ok", true),
SYS_ERROR(500, "网络繁忙,请您稍后重试", false),
FILE_FORMAT_ERROR(1, "文件格式错误", true),
PARAM_NULL(6, "请检查您的参数是否填写完整。", true),
;
public CodeEnum addMsg(String msg){
this.msg = msg+"行:"+this.msg;
return this;
}
public static CodeEnum getByCode(int code) {
for (CodeEnum codeEnum: CodeEnum.values()) {
if (codeEnum.getCode() == code) {
return codeEnum;
}
}
return null;
}
private CodeEnum(Integer code, String msg, boolean success) {
this.code = code;
this.msg = msg;
this.success = success;
}
private Integer code;
private String msg;
private boolean success;
}

594
scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java

@ -0,0 +1,594 @@
package com.ccsens.scheduler.util;
public class Constant {
public static final String PARAMETER_KEY_TOKEN = "token";
public static final String HEADER_KEY_TOKEN = "Authorization";
public static final String HEADER_KEY_TOKEN_PREFIX = "Bearer ";
public static final String REQUEST_KEY_CLAIMS = "claims";
public static final String REQUEST_KEY_TOKEN_USERS = "Token_User";
public static final String RANDOM_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
public static final String IMAGE_CODE = "image_code_";
public static final String DYNAMIC_DATASOURCE_SCHEMA_KEY = "${schema}";
public enum REC_STATUS {
Normal((byte) 0,"正常"), Disabled((byte) 1,"已禁用"),Deleted((byte) 2,"已删除");
public byte value;
public String phase;
REC_STATUS(byte value,String thePhase){
this.value =value;
this.phase = thePhase;
}
}
public enum PARTI_LOGIN_STATUS {
SUCCESS(0,"登陆成功"), ToStep2(1,"进入下一步");
public int value;
public String phase;
PARTI_LOGIN_STATUS(int value,String thePhase){
this.value =value;
this.phase = thePhase;
}
}
public enum Gender{
Unknown(0,"未知"),Male(1,"男"),Female(2,"女");
public int value;
public String phase;
Gender(int value,String thePhase){
this.value =value;
this.phase = thePhase;
}
}
public enum Parti_Verify_Type{
Phone(0,"手机"),Email(1,"邮件"),Account(2,"账号");
public int value;
public String phase;
Parti_Verify_Type(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Parti_Verify_Type valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Phone;
case 1: return Email;
case 2: return Account;
default: return null;
}
}
}
public enum PartiVerify{
None(0,"无验证"),Verify(1,"验证");
public int value;
public String phase;
PartiVerify(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
}
public enum TASK_Execute_Type {
Start(0,"开始"),Complete(1,"完成");
public int value;
public String phase;
TASK_Execute_Type(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
}
public enum Message_Type{
Heart(0x00,"Heart"),Ack(0x01,"Ack"),Auth(0x02,"Auth"),Channel(0x03,"Channel")
,Sync(0x04,"Sync")
,Node(0x05,"Node"),User(0x06,"User"), Timer(0x07,"Timer")
,Error(0x99,"Error")
,MasterStatus(0x10,"MasterStatus")
,BatchSetting(0x11,"BatchSetting")
,Admin(0x12,"Admin")
,Ring(0x13,"Ring")
,Deliver(0x14,"Deliver")
,Game(0x15,"Game")
,Chrome(0x15,"Chrome")
,PPTCtl(0x15,"PPTCtl")
,Count(0x16,"Count")
,ChangeStatus(0x17,"ChangeStatus")
,PROJECT_MESSAGE(0x18, "ProjectMessage");
public int value;
public String phase;
Message_Type(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Type valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0x00: return Heart;
case 0x01: return Ack;
case 0x02: return Auth;
case 0x03: return Channel;
case 0x04: return Sync;
case 0x05: return Node;
case 0x06: return User;
case 0x07: return Timer;
case 0x10: return MasterStatus;
case 0x11: return BatchSetting;
case 0x12: return Admin;
case 0x13: return Ring;
case 0x14: return Deliver;
case 0x15: return Game;
case 0x16: return Count;
case 0x17: return ChangeStatus;
default: return null;
}
}
public static Message_Type phaseOf(String phase) { // 手写的从String到enum的转换函数
if("Sync".equalsIgnoreCase(phase)) {
return Sync;
}
if("Ack".equalsIgnoreCase(phase)) {
return Ack;
}
if("Node".equalsIgnoreCase(phase)) {
return Node;
}
if("User".equalsIgnoreCase(phase)) {
return User;
}
if("Heart".equalsIgnoreCase(phase)) {
return Heart;
}
if("Auth".equalsIgnoreCase(phase)) {
return Auth;
}
if("Channel".equalsIgnoreCase(phase)) {
return Channel;
}
if("Timer".equalsIgnoreCase(phase)) {
return Timer;
}
if("MasterStatus".equalsIgnoreCase(phase)) {
return MasterStatus;
}
if("BatchSetting".equalsIgnoreCase(phase)) {
return BatchSetting;
}
if(phase.equalsIgnoreCase("Admin")) {
return Admin;
}
if(phase.equalsIgnoreCase("Ring")) {
return Ring;
}
if(phase.equalsIgnoreCase("Deliver")) {
return Deliver;
}
if("Game".equalsIgnoreCase(phase)) {
return Game;
}
if("Count".equalsIgnoreCase(phase)) {
return Count;
}
if("ChangeStatus".equalsIgnoreCase(phase)) {
return Count;
}else {
return null;
}
}
}
public enum Message_Ack_Event{
Ack(0,"Ack");
public int value;
public String phase;
Message_Ack_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Ack_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Ack;
default: return null;
}
}
public static Message_Ack_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Ack")) {
return Ack;
} else {
return null;
}
}
}
public enum Message_Sync_Event{
ChangeDuration(0,"ChangeDuration"),Move(1,"Move"),
Remove(2,"Remove"),Add(3,"Add"),Start(4,"Start"),ChangeBeginTime(5,"ChangeBeginTime"),Show(6,"Show");
public int value;
public String phase;
Message_Sync_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Sync_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return ChangeDuration;
case 1: return Move;
case 2: return Remove;
case 3: return Add;
case 4: return Start;
case 5: return ChangeBeginTime;
case 6: return Show;
default: return null;
}
}
public static Message_Sync_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Start")) {
return Start;
}
if(phase.equalsIgnoreCase("ChangeDuration")) {
return ChangeDuration;
}
if(phase.equalsIgnoreCase("Move")) {
return Move;
}
if(phase.equalsIgnoreCase("Remove")) {
return Remove;
}
if(phase.equalsIgnoreCase("Add")) {
return Add;
}
if(phase.equalsIgnoreCase("ChangeBeginTime")) {
return ChangeBeginTime;
}
if(phase.equalsIgnoreCase("Show")) {
return Show;
} else {
return null;
}
}
}
public enum Message_Node_Event{
ChangeStatus(0,"ChangeStatus"),PostComment(1,"PostComment"),UploadDeliver(2,"UploadDeliver");
public int value;
public String phase;
Message_Node_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Node_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return ChangeStatus;
case 1: return PostComment;
case 2: return UploadDeliver;
default: return null;
}
}
public static Message_Node_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("ChangeStatus")) {
return ChangeStatus;
}
if(phase.equalsIgnoreCase("PostComment")) {
return PostComment;
}
if(phase.equalsIgnoreCase("UploadDeliver")) {
return UploadDeliver;
} else {
return null;
}
}
}
public enum Message_User_Event{
HasRead(0,"HasRead"),User(1,"User");
public int value;
public String phase;
Message_User_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_User_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return HasRead;
case 1: return User;
default: return null;
}
}
public static Message_User_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("HasRead")) {
return HasRead;
}
if(phase.equalsIgnoreCase("User")) {
return User;
} else {
return null;
}
}
}
public enum Message_Heart_Event{
Heart(0,"Heart");
public int value;
public String phase;
Message_Heart_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Heart_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Heart;
default: return null;
}
}
public static Message_Heart_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Heart")) {
return Heart;
} else {
return null;
}
}
}
public enum Message_Auth_Event{
Auth(0,"Auth"),
Answer(1,"Answer");
public int value;
public String phase;
Message_Auth_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Auth_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Auth;
case 1: return Answer;
default: return null;
}
}
public static Message_Auth_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Auth")) {
return Auth;
}
if(phase.equalsIgnoreCase("Answer")) {
return Answer;
}else {
return null;
}
}
}
public enum Message_Channel_Event{
Channel(0,"Channel");
public int value;
public String phase;
Message_Channel_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Channel_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Channel;
default: return null;
}
}
public static Message_Channel_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Channel")) {
return Channel;
} else {
return null;
}
}
}
public enum Message_MasterStatus_Event{
Report(0,"Report"),Query(1,"Query"),Answer(2,"Answer");
public int value;
public String phase;
Message_MasterStatus_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_MasterStatus_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Report;
case 1: return Query;
case 2: return Answer;
default: return null;
}
}
public static Message_MasterStatus_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Report")) {
return Report;
}
if(phase.equalsIgnoreCase("Query")) {
return Query;
}
if(phase.equalsIgnoreCase("Answer")) {
return Answer;
} else {
return null;
}
}
}
@SuppressWarnings("all")
public enum Task_Check_Status{
PENDING(0,"未审核"),FAILURE(1,"审核未通过"),SUCCESS(2,"审核已通过");
public int value;
public String phase;
Task_Check_Status(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Task_Check_Status valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return PENDING;
case 1: return FAILURE;
case 2: return SUCCESS;
default: return null;
}
}
public static Task_Check_Status phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("PENDING")) {
return PENDING;
}else if(phase.equalsIgnoreCase("FAILURE")) {
return FAILURE;
} else if(phase.equalsIgnoreCase("SUCCESS")) {
return SUCCESS;
} else {
return null;
}
}
}
public enum Message_BatchSetting_Event{
Apply(0,"Apply"),Answer(1,"Answer");
public int value;
public String phase;
Message_BatchSetting_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_BatchSetting_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Apply;
case 1: return Answer;
default: return null;
}
}
public static Message_BatchSetting_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Apply")) {
return Apply;
}
if(phase.equalsIgnoreCase("Answer")) {
return Answer;
}
return null;
}
}
public enum Message_Admin_Event{
FindAll(0,"FindAll");
public int value;
public String phase;
Message_Admin_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Admin_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return FindAll;
default: return null;
}
}
public static Message_Admin_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("FindAll")) {
return FindAll;
} else {
return null;
}
}
}
public enum Message_Ring_Event{
Send(0,"Send")
,Read(1,"Read");
public int value;
public String phase;
Message_Ring_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Ring_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Send;
case 1: return Read;
default: return null;
}
}
public static Message_Ring_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Send")) {
return Send;
}
if(phase.equalsIgnoreCase("Read")) {
return Read;
} else {
return null;
}
}
}
public enum Message_Deliver_Event{
Upload(0,"Upload")
,Checker(1,"Checker")
,Delete(2,"Delete");
public int value;
public String phase;
Message_Deliver_Event(int value,String thePhase){
this.value = value;
this.phase = thePhase;
}
public static Message_Deliver_Event valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 0: return Upload;
case 1: return Checker;
case 2: return Delete;
default: return null;
}
}
public static Message_Deliver_Event phaseOf(String phase) { // 手写的从String到enum的转换函数
if(phase.equalsIgnoreCase("Upload")) {
return Upload;
}
if(phase.equalsIgnoreCase("Checker")) {
return Checker;
}
if(phase.equalsIgnoreCase("Delete")) {
return Delete;
} else {
return null;
}
}
}
//wbs表时间类型==================================================================/
/**
* redis类型
*/
public enum RedisType{
/**redis类型**/
STRING(0,"字符串类型"),
LIST_INDEX(1,"列表-某一个"),
LIST_RANGE(2,"列表-范围"),
SET(3,"集合"),
SORT_SET_RANGE(4,"有序集合-index"),
SORT_SET_SCORE(5,"有序集合-分数"),
HASH_ITEM(6, "哈希-某一项"),
HASH(7, "哈希-全部"),
;
/**类型code*/
public int type;
/**类型*/
public String message;
RedisType(int type, String message) {
this.type = type;
this.message = message;
}
}
}

102
scheduler/src/main/java/com/ccsens/scheduler/util/JsonResponse.java

@ -0,0 +1,102 @@
package com.ccsens.scheduler.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class JsonResponse<T> {
/**
* Common Error Constant
*/
public static class RegularError {
public static final int ERRCODE_SUCCESS = 200;
public static final String ERRCODE_SUCCESS_PHASE = "ok";
public static final int ERRCODE_FAIL = -1;
public static final String ERRCODE_FAIL_PHASE = "error";
}
@ApiModelProperty(value="状态码")
private Integer code;
@ApiModelProperty(value="数据")
private T data;
@ApiModelProperty(value="消息")
private String msg;
@ApiModelProperty(value="成功与否")
private boolean success;
private JsonResponse() {
}
public static JsonResponse newInstance(){
return new JsonResponse();
}
public JsonResponse ok(){
this.code = CodeEnum.SUCCESS.getCode();
this.msg = CodeEnum.SUCCESS.getMsg();
this.success = CodeEnum.SUCCESS.isSuccess();
return this;
}
public JsonResponse<T> ok(T data){
ok();
this.data = data;
return this;
}
public JsonResponse ok(CodeEnum codeEnum){
this.code = codeEnum.getCode();
this.msg = codeEnum.getMsg();
this.success = codeEnum.isSuccess();
return this;
}
public JsonResponse ok(CodeEnum codeEnum, T data){
this.code = codeEnum.getCode();
this.msg = codeEnum.getMsg();
this.success = codeEnum.isSuccess();
this.data = data;
return this;
}
public JsonResponse fail(){
this.code = RegularError.ERRCODE_FAIL;
this.msg = RegularError.ERRCODE_FAIL_PHASE;
this.success = false;
return this;
}
public JsonResponse fail(String error){
fail();
this.msg = error;
return this;
}
public JsonResponse fail(int code){
fail();
this.code = code;
return this;
}
public JsonResponse fail(int code, String error){
fail();
this.code = code;
this.msg = error;
return this;
}
public JsonResponse fail(int code, String error, T obj){
fail();
this.code = code;
this.msg = error;
this.data = obj;
return this;
}
}

23
scheduler/src/main/java/com/ccsens/scheduler/util/PropUtil.java

@ -0,0 +1,23 @@
package com.ccsens.scheduler.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @program: ptpro
* @description:
* @author: wu huijuan
* @create: 2019/10/21 10:37
*/
@Component
public class PropUtil {
public static String path;
@Value("${file.path:}")
public void setPath(String path) {
PropUtil.path = path;
}
}

750
scheduler/src/main/java/com/ccsens/scheduler/util/RedisUtil.java

@ -0,0 +1,750 @@
package com.ccsens.scheduler.util;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 指定缓存失效时间
*
* @param key
* @param time 时间()
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key 不能为null
* @return 时间() 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
//============================String=============================
/**
* 普通缓存获取
*
* @param key
* @return
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key
* @param value
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key
* @param value
* @param seconds 时间() time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long seconds) {
try {
if (seconds > 0) {
redisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入
*
* @param key
* @param value
* @return true成功 false失败
*/
public boolean setNx(String key, Object value) {
try {
return redisTemplate.opsForValue().setIfAbsent(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key
* @param value
* @param seconds 时间() time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean setNx(String key, Object value, long seconds) {
try {
if (seconds > 0) {
return redisTemplate.opsForValue().setIfAbsent(key, value, seconds, TimeUnit.SECONDS);
} else {
return setNx(key, value);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
*
* @param key
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key
* @param delta 要减少几(小于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
//================================Map=================================
/**
* HashGet
*
* @param key 不能为null
* @param item 不能为null
* @return
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key
* @return 对应的多个键值
*/
public Map<Object, Object> hmget(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
*
* @param key
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String, Object> map) {
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并设置时间
*
* @param key
* @param map 对应多个键值
* @param time 时间()
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String, Object> map, long time) {
try {
redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key
* @param item
* @param value
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key
* @param item
* @param value
* @param time 时间() 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value, long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除hash表中的值
*
* @param key 不能为null
* @param item 可以使多个 不能为null
*/
public void hdel(String key, Object... item) {
redisTemplate.opsForHash().delete(key, item);
}
/**
* 判断hash表中是否有该项的值
*
* @param key 不能为null
* @param item 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item) {
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
*
* @param key
* @param item
* @param by 要增加几(大于0)
* @return
*/
public double hincr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
*
* @param key
* @param item
* @param by 要减少记(小于0)
* @return
*/
public double hdecr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, -by);
}
//============================set=============================
/**
* 根据key获取Set中的所有值
*
* @param key
* @return
*/
public Set<Object> sGet(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
*
* @param key
* @param value
* @return true 存在 false不存在
*/
public boolean sHasKey(String key, Object value) {
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将数据放入set缓存
*
* @param key
* @param values 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将set数据放入缓存
*
* @param key
* @param time 时间()
* @param values 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key, long time, Object... values) {
try {
Long count = redisTemplate.opsForSet().add(key, values);
if (time > 0) expire(key, time);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取set缓存的长度
*
* @param key
* @return
*/
public long sGetSetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
*
* @param key
* @param values 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object... values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
//===============================list=================================
/**
* 获取list缓存的内容
*
* @param key
* @param start 开始
* @param end 结束 0 -1代表所有值
* @return
*/
public List<Object> lGet(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取list缓存的长度
*
* @param key
* @return
*/
public long lGetListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过索引 获取list中的值
*
* @param key
* @param index 索引 index>=0时 0 表头1 第二个元素依次类推index<0时-1表尾-2倒数第二个元素依次类推
* @return
*/
public Object lGetIndex(String key, long index) {
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将list放入缓存
*
* @param key
* @param value
* @return
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key
* @param value
* @param time 时间()
* @return
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key
* @param value
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key
* @param value
* @param time 时间()
* @return
*/
public boolean lSet(String key, List<? extends Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据索引修改list中的某条数据
*
* @param key
* @param index 索引
* @param value
* @return
*/
public boolean lUpdateIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N个值为value
*
* @param key
* @param count 移除多少个
* @param value
* @return 移除的个数
*/
public long lRemove(String key, long count, Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
//===============================zset=================================
/**
* 获取sort set缓存的内容
* @author whj
* @date 2019/8/1
* @param key
* @param small 起始分数
* @param max 结束分数
* @return java.util.Set<java.lang.Object>
*/
public Set<Object> zsGetByScore(String key, double small, double max) {
return redisTemplate.opsForZSet().rangeByScore(key, small, max);
}
/**
* 获取sort set缓存的内容
* @author whj
* @date 2019/8/1
* @param key
* @param start 开始 0:第一个元素
* @param end 结束 -1代表所有
* @return java.util.Set<java.lang.Object>
*/
public Set<Object> zsGet(String key, long start, long end) {
return redisTemplate.opsForZSet().range(key, start, end);
}
/**
* 获取sort set缓存的内容(包含分数)
* @author whj
* @date 2019/8/1
* @param key
* @param start 开始 0:第一个元素
* @param end 结束 -1代表所有
* @return java.util.Set<ZSetOperations.TypedTuple<Object>>
*/
public Set<ZSetOperations.TypedTuple<Object>> zsGetWithScore(String key, long start, long end) {
return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
}
/**
* 分数由高到低 获取sort set缓存的内容
* @author whj
* @date 2019/8/1
* @param key
* @param start 开始 0:第一个元素
* @param end 结束 -1代表所有
* @return java.util.Set<java.lang.Object>
*/
public Set<Object> zsRevGet(String key, long start, long end) {
return redisTemplate.opsForZSet().reverseRange(key, start, end);
}
/**
* 分数由高到低 获取sort set缓存的内容(包含分数)
* @author whj
* @date 2019/8/1
* @param key
* @param start 开始 0:第一个元素
* @param end 结束 -1代表所有
* @return java.util.Set<ZSetOperations.TypedTuple<Object>>
*/
public Set<ZSetOperations.TypedTuple<Object>> zsRevGetWithScore(String key, long start, long end) {
return redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);
}
/**
* 添加zset
* @author whj
* @date 2019/8/1
* @param key
* @param value
* @param score
* @return boolean
*/
public boolean zsSet(String key, Object value, double score) {
return redisTemplate.opsForZSet().add(key, value, score);
}
/**
* 添加zset
* @author whj
* @date 2019/8/1
* @param key
* @param value
* @param score
* @return boolean
*/
public boolean zsSet(String key, Object value, double score, long time) {
redisTemplate.opsForZSet().add(key, value, score);
if (time > 0) {
expire(key, time);
}
return true;
}
/**
* 获取zset长度
* @author whj
* @date 2019/8/1
* @param key
* @return
*/
public Long zsGetSize(String key) {
return redisTemplate.opsForZSet().size(key);
}
/**
* 删除元素
* @param key
* @param values
* @return
*/
public Long zsDel(String key, Object... values) {
return redisTemplate.opsForZSet().remove(key, values);
}
/**
* 获取对应分数
* @param key
* @param value
* @return
*/
public Object zsGetScore(String key, Object value) {
return redisTemplate.opsForZSet().score(key, value);
}
/**
* 查询排第几
* @param key
* @param value
* @return
*/
public Long zsRank(String key, Object value) {
return redisTemplate.opsForZSet().rank(key, value);
}
/**
* 查询倒叙排第几
* @param key
* @param value
* @return
*/
public Long zsReverseRank(String key, Object value) {
return redisTemplate.opsForZSet().reverseRank(key, value);
}
}

27
scheduler/src/main/resources/application-common.yml

@ -0,0 +1,27 @@
logging:
level:
com:
favorites: DEBUG
org:
hibernate: ERROR
springframework:
web: DEBUG
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath*:mapper_*/*.xml
type-aliases-package: com.ccsens.ht.bean
server:
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
spring:
servlet:
multipart:
max-file-size: 10GB
max-request-size: 100GB
mvc:
log-request-details: true

22
scheduler/src/main/resources/application-dev.yml

@ -0,0 +1,22 @@
server:
port: 8001
spring:
snowflake:
datacenterId: 1
workerId: 1
datasource:
type: com.alibaba.druid.pool.DruidDataSource
redis:
database: 0
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1ms
min-idle: 0
password: ''
port: 6379
timeout: 1000ms
swagger:
enable: true

22
scheduler/src/main/resources/application-prod.yml

@ -0,0 +1,22 @@
server:
port: 8000
spring:
snowflake:
datacenterId: 1
workerId: 1
datasource:
type: com.alibaba.druid.pool.DruidDataSource
redis:
database: 0
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1ms
min-idle: 0
password:
port: 6379
timeout: 1000ms
swagger:
enable: false

24
scheduler/src/main/resources/application-test.yml

@ -0,0 +1,24 @@
server:
port: 8000
spring:
snowflake:
datacenterId: 1
workerId: 1
datasource:
type: com.alibaba.druid.pool.DruidDataSource
redis:
database: 0
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1ms
min-idle: 0
password: ''
port: 6379
timeout: 1000ms
swagger:
enable: true

4
scheduler/src/main/resources/application.yml

@ -0,0 +1,4 @@
spring:
profiles:
active: dev
include: common

22
scheduler/src/main/resources/banner.txt

@ -0,0 +1,22 @@
/**
* _ooOoo_
* o8888888o
* 88" . "88
* (| -_- |)
* O\ = /O
* ___/`---'\____
* . ' \\| |// `.
* / \\||| : |||// \
* / _||||| -:- |||||- \
* | | \\\ - /// | |
* | \_| ''\---/'' | |
* \ .-\__ `-` ___/-. /
* ___`. .' /--.--\ `. . __
* ."" '< `.___\_<|>_/___.' >'"".
* | | : `- \`.;`\ _ /`;.`/ - ` : | |
* \ \ `-. \_ __\ /__ _/ .-` / /
* ======`-.____`-.___\_____/___.-`____.-'======
* `=---='
* .............................................
* 佛曰:bug泛滥,我已瘫痪!
*/

33
scheduler/src/main/resources/druid-dev.yml

@ -0,0 +1,33 @@
spring:
datasource:
druid:
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
driverClassName: com.mysql.cj.jdbc.Driver
dynamicUrl: jdbc:mysql://localhost:3306/${schema}
filterExclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filterName: druidFilter
filterProfileEnable: true
filterUrlPattern: /*
filters: stat,wall
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 5
password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473
poolPreparedStatements: true
servletLogSlowSql: true
servletLoginPassword: 111111
servletLoginUsername: druid
servletName: druidServlet
servletResetEnable: true
servletUrlMapping: /druid/*
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://49.233.89.188:3306/scheduler?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
validationQuery: SELECT 1 FROM DUAL
env: CCSENS_TALL

34
scheduler/src/main/resources/druid-prod.yml

@ -0,0 +1,34 @@
spring:
datasource:
druid:
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
driverClassName: com.mysql.cj.jdbc.Driver
dynamicUrl: jdbc:mysql://127.0.0.1:3306/${schema}
filterExclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filterName: druidFilter
filterProfileEnable: true
filterUrlPattern: /*
filters: stat,wall
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 5
# password: 7cdefb88e0b8c8a401b66a83ee0cf80387461268074d1c3dcb146ab485318633
password:
poolPreparedStatements: true
servletLogSlowSql: true
servletLoginPassword: 111111
servletLoginUsername: druid
servletName: druidServlet
servletResetEnable: true
servletUrlMapping: /druid/*
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://127.0.0.1/scheduler?useUnicode=true&characterEncoding=UTF-8
username: root
validationQuery: SELECT 1 FROM DUAL
env: CCSENS_HEALTH

34
scheduler/src/main/resources/druid-test.yml

@ -0,0 +1,34 @@
spring:
datasource:
druid:
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
driverClassName: com.mysql.cj.jdbc.Driver
dynamicUrl: jdbc:mysql://localhost:3306/${schema}
filterExclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filterName: druidFilter
filterProfileEnable: true
filterUrlPattern: /*
filters: stat,wall
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 5
# password:
password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473
poolPreparedStatements: true
servletLogSlowSql: true
servletLoginPassword: 111111
servletLoginUsername: druid
servletName: druidServlet
servletResetEnable: true
servletUrlMapping: /druid/*
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://test.tall.wiki/scheduler?useUnicode=true&characterEncoding=UTF-8
username: root
validationQuery: SELECT 1 FROM DUAL
env: CCSENS_TALL

196
scheduler/src/main/resources/logback-spring.xml

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="/home/scheduler/log/" />
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
以及指定<appender><logger>仅有一个name属性,
一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
-->
<!--<logger name="org.springframework.web" level="info"/>-->
<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
<!--
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-->
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<!--开发环境:打印控制台-->
<springProfile name="dev">
<logger name="com.ccsens.ptpro.persist.*" level="debug"/>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!--生产环境:输出到文件-->
<!--<springProfile name="pro">-->
<!--<root level="info">-->
<!--<appender-ref ref="CONSOLE" />-->
<!--<appender-ref ref="DEBUG_FILE" />-->
<!--<appender-ref ref="INFO_FILE" />-->
<!--<appender-ref ref="ERROR_FILE" />-->
<!--<appender-ref ref="WARN_FILE" />-->
<!--</root>-->
<!--</springProfile>-->
</configuration>

68
scheduler/src/main/resources/mbg.xml

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySQL" targetRuntime="MyBatis3">
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- 自定义的序列化 类文件 插件 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<!-- 重新生成xml文件,而不是追加 -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://49.233.89.188:3306/scheduler?useUnicode=true&amp;characterEncoding=UTF-8&amp;tinyInt1isBit=false"
userId="root"
password="po3OynBO[M3579p6L7)o">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="true" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.ccsens.scheduler.bean.po"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper_raw"
targetProject=".\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.ccsens.scheduler.persist.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<table tableName="t_file_commit" domainObjectName="FileCommit"/>
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>

64
scheduler/src/main/resources/mybatis/mybatis-config.xml

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 打印SQL语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="Map" type="java.util.Map" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
<typeAlias alias="List" type="java.util.List" />
<typeAlias alias="String" type="java.lang.String" />
</typeAliases>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="false"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="false"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="false"/>
<property name="supportMethodsArguments" value="false"/>
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
</configuration>
Loading…
Cancel
Save