init project
This commit is contained in:
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@@ -1,8 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
6
.idea/compiler.xml
generated
6
.idea/compiler.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CompilerConfiguration">
|
|
||||||
<bytecodeTargetLevel target="8" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
6
.idea/dictionaries
generated
6
.idea/dictionaries
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectDictionaryState">
|
|
||||||
<dictionary name="mima0000" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
37
.idea/inspectionProfiles/Project_Default.xml
generated
37
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,37 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
||||||
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="TOP_LEVEL_CLASS_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="INNER_CLASS_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="METHOD_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="FIELD_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="IGNORE_DEPRECATED" value="false" />
|
|
||||||
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
|
|
||||||
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
|
|
||||||
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
|
|
||||||
<option name="myAdditionalJavadocTags" value="date" />
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/nl-sso-server.iml" filepath="$PROJECT_DIR$/.idea/nl-sso-server.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
9
.idea/nl-sso-server.iml
generated
9
.idea/nl-sso-server.iml
generated
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
||||||
<exclude-output />
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
2
nladmin-system/.gitignore
vendored
2
nladmin-system/.gitignore
vendored
@@ -7,3 +7,5 @@
|
|||||||
/.gradle/
|
/.gradle/
|
||||||
/target/*
|
/target/*
|
||||||
*/application-dev.yml
|
*/application-dev.yml
|
||||||
|
nlsso-server/src/main/java/org/nl/common/constant/
|
||||||
|
nlsso-server/src/main/java/org/nl/common/core/
|
||||||
|
|||||||
@@ -32,6 +32,59 @@
|
|||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.dynamictp</groupId>
|
||||||
|
<artifactId>dynamic-tp-spring-boot-starter-common</artifactId>
|
||||||
|
<version>1.0.9</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.dynamictp</groupId>
|
||||||
|
<artifactId>dynamic-tp-spring-boot-starter-adapter-webserver</artifactId>
|
||||||
|
<version>1.0.9</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 数据库版本管理-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.flywaydb</groupId>
|
||||||
|
<artifactId>flyway-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--日志管理-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.plumelog</groupId>
|
||||||
|
<artifactId>plumelog-lite-spring-boot-starter</artifactId>
|
||||||
|
<version>3.5.3</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>plumelog-core</artifactId>
|
||||||
|
<groupId>com.plumelog</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.plumelog</groupId>
|
||||||
|
<artifactId>plumelog-trace</artifactId>
|
||||||
|
<version>3.5.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.redisson</groupId>
|
||||||
|
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||||
|
<version>3.12.3</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!--工具包-->
|
<!--工具包-->
|
||||||
@@ -389,13 +442,6 @@
|
|||||||
<version>5.0.1</version>
|
<version>5.0.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!--loki-->
|
|
||||||
<!-- https://loki4j.github.io/loki-logback-appender/#quick-start -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.github.loki4j</groupId>
|
|
||||||
<artifactId>loki-logback-appender-jdk8</artifactId>
|
|
||||||
<version>1.3.2</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.httpcomponents</groupId>
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
<artifactId>httpclient</artifactId>
|
<artifactId>httpclient</artifactId>
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
@RestController
|
@RestController
|
||||||
@Api(hidden = true)
|
@Api(hidden = true)
|
||||||
@SpringBootApplication(exclude = {
|
@SpringBootApplication(exclude = {
|
||||||
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
|
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
|
||||||
|
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration.class
|
||||||
})
|
})
|
||||||
@ServletComponentScan //https://blog.csdn.net/qq_36850813/article/details/101194250
|
@ServletComponentScan //https://blog.csdn.net/qq_36850813/article/details/101194250
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@@ -38,7 +39,6 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
public class AppRun {
|
public class AppRun {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
SpringApplication.run(AppRun.class, args);
|
SpringApplication.run(AppRun.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package org.nl.config;
|
||||||
|
|
||||||
|
import com.dtp.core.support.ThreadPoolBuilder;
|
||||||
|
import com.dtp.core.support.ThreadPoolCreator;
|
||||||
|
import com.dtp.core.thread.DtpExecutor;
|
||||||
|
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ldjun
|
||||||
|
* @version 1.0
|
||||||
|
* @date 2023年01月13日 14:30
|
||||||
|
* @desc desc
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class DtpConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过{@link ThreadPoolCreator} 快速创建一些简单配置的动态线程池
|
||||||
|
* tips: 建议直接在配置中心配置就行,不用@Bean声明
|
||||||
|
*
|
||||||
|
* @return 线程池实例
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public DtpExecutor dtpExecutor1() {
|
||||||
|
|
||||||
|
return ThreadPoolBuilder.newBuilder()
|
||||||
|
.threadPoolName("dtpExecutor1")
|
||||||
|
.corePoolSize(1)
|
||||||
|
.maximumPoolSize(1)
|
||||||
|
.queueCapacity(1)
|
||||||
|
.ioIntensive(true)
|
||||||
|
.buildDynamic();
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public Object tomcatServletWebServerFactory(ServletWebServerFactory webServerFactory) {
|
||||||
|
return new Object();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -12,8 +12,7 @@
|
|||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*//*
|
*/
|
||||||
|
|
||||||
package org.nl.modules.logging.aspect;
|
package org.nl.modules.logging.aspect;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
@@ -27,18 +26,13 @@ import org.aspectj.lang.annotation.Aspect;
|
|||||||
import org.aspectj.lang.annotation.Pointcut;
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
import org.aspectj.lang.reflect.MethodSignature;
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
import org.nl.modules.common.utils.RequestHolder;
|
import org.nl.modules.common.utils.RequestHolder;
|
||||||
import org.nl.modules.common.utils.SecurityUtils;
|
|
||||||
import org.nl.modules.common.utils.StringUtils;
|
|
||||||
import org.nl.modules.common.utils.ThrowableUtil;
|
import org.nl.modules.common.utils.ThrowableUtil;
|
||||||
import org.nl.modules.logging.domain.Log;
|
import org.nl.modules.logging.domain.Log;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.context.request.RequestContextHolder;
|
|
||||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Parameter;
|
import java.lang.reflect.Parameter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -46,57 +40,43 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* @author Zheng Jie
|
* @author Zheng Jie
|
||||||
* @date 2018-11-24
|
* @date 2018-11-24
|
||||||
*//*
|
*/
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Aspect
|
@Aspect
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class LogAspect {
|
public class LogAspect {
|
||||||
|
|
||||||
private final LogService logService;
|
// private final LogService logService;
|
||||||
|
|
||||||
ThreadLocal<Long> currentTime = new ThreadLocal<>();
|
ThreadLocal<Long> currentTime = new ThreadLocal<>();
|
||||||
|
|
||||||
public LogAspect(LogService logService) {
|
// public LogAspect(LogService logService) {
|
||||||
this.logService = logService;
|
// this.logService = logService;
|
||||||
}
|
// }
|
||||||
|
|
||||||
*/
|
/**
|
||||||
/**
|
|
||||||
* 配置切入点
|
* 配置切入点
|
||||||
*//*
|
*/
|
||||||
|
|
||||||
@Pointcut("@annotation(org.nl.modules.logging.annotation.Log)")
|
@Pointcut("@annotation(org.nl.modules.logging.annotation.Log)")
|
||||||
public void logPointcut() {
|
public void logPointcut() {
|
||||||
// 该方法无方法体,主要为了让同类中其他方法使用此切入点
|
// 该方法无方法体,主要为了让同类中其他方法使用此切入点
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
/**
|
||||||
/**
|
|
||||||
* 配置环绕通知,使用在方法logPointcut()上注册的切入点
|
* 配置环绕通知,使用在方法logPointcut()上注册的切入点
|
||||||
*
|
*
|
||||||
* @param joinPoint join point for advice
|
* @param joinPoint join point for advice
|
||||||
*//*
|
*/
|
||||||
|
|
||||||
@Around("logPointcut()")
|
@Around("logPointcut()")
|
||||||
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
|
||||||
HttpServletRequest request = attributes.getRequest();
|
|
||||||
HttpServletResponse response = attributes.getResponse();
|
|
||||||
// HttpServletRequest request = RequestHolder.getHttpServletRequest();
|
|
||||||
|
|
||||||
|
|
||||||
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
Method method = signature.getMethod();
|
Method method = signature.getMethod();
|
||||||
// 方法路径
|
// 方法路径
|
||||||
String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
|
String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
|
||||||
String params=getParameter(method, joinPoint.getArgs());
|
String params=getParameter(method, joinPoint.getArgs());
|
||||||
|
|
||||||
log.info("请求uri:{}", request.getRequestURI());
|
|
||||||
log.info("请求方法:{}",methodName);
|
log.info("请求方法:{}",methodName);
|
||||||
log.info("请求方法参数:{}",params);
|
log.info("请求方法参数:{}",params);
|
||||||
|
|
||||||
@@ -105,16 +85,14 @@ public class LogAspect {
|
|||||||
result = joinPoint.proceed();
|
result = joinPoint.proceed();
|
||||||
Log log = new Log("INFO",System.currentTimeMillis() - currentTime.get());
|
Log log = new Log("INFO",System.currentTimeMillis() - currentTime.get());
|
||||||
currentTime.remove();
|
currentTime.remove();
|
||||||
|
HttpServletRequest request = RequestHolder.getHttpServletRequest();
|
||||||
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request),joinPoint, log);
|
// logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request),joinPoint, log);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
/**
|
||||||
/**
|
|
||||||
* 根据方法和传入的参数获取请求参数
|
* 根据方法和传入的参数获取请求参数
|
||||||
*//*
|
*/
|
||||||
|
|
||||||
private String getParameter(Method method, Object[] args) {
|
private String getParameter(Method method, Object[] args) {
|
||||||
List<Object> argList = new ArrayList<>();
|
List<Object> argList = new ArrayList<>();
|
||||||
Parameter[] parameters = method.getParameters();
|
Parameter[] parameters = method.getParameters();
|
||||||
@@ -142,29 +120,27 @@ public class LogAspect {
|
|||||||
return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
|
return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
/**
|
||||||
/**
|
|
||||||
* 配置异常通知
|
* 配置异常通知
|
||||||
*
|
*
|
||||||
* @param joinPoint join point for advice
|
* @param joinPoint join point for advice
|
||||||
* @param e exception
|
* @param e exception
|
||||||
*//*
|
*/
|
||||||
|
|
||||||
@AfterThrowing(pointcut = "logPointcut()", throwing = "e")
|
@AfterThrowing(pointcut = "logPointcut()", throwing = "e")
|
||||||
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
|
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
|
||||||
Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get());
|
Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get());
|
||||||
currentTime.remove();
|
currentTime.remove();
|
||||||
log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes());
|
log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes());
|
||||||
HttpServletRequest request = RequestHolder.getHttpServletRequest();
|
HttpServletRequest request = RequestHolder.getHttpServletRequest();
|
||||||
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, log);
|
// logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
try {
|
try {
|
||||||
return SecurityUtils.getCurrentUsername();
|
return "默认用户名";
|
||||||
|
// return SecurityUtils.getCurrentUsername();
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package org.nl.modules.loki.rest;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.nl.modules.common.annotation.RateLimiter;
|
|
||||||
import org.nl.modules.loki.service.LokiService;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: lyd
|
|
||||||
* @Description: 日志监控
|
|
||||||
* @Date: 2022-08-15
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Api(tags = "日志监控")
|
|
||||||
@RequestMapping("/api/loki")
|
|
||||||
@Slf4j
|
|
||||||
public class LokiController {
|
|
||||||
|
|
||||||
private final LokiService lokiService;
|
|
||||||
|
|
||||||
@GetMapping("/labels/values")
|
|
||||||
@ApiOperation("获取标签")
|
|
||||||
public ResponseEntity<Object> labelsValues() {
|
|
||||||
return new ResponseEntity<>(lokiService.getLabelsValues(), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/logs")
|
|
||||||
@ApiOperation("获取日志")
|
|
||||||
@RateLimiter(value = 1, timeout = 300) // 限流
|
|
||||||
public ResponseEntity<Object> getLogData(@RequestBody JSONObject json) {
|
|
||||||
return new ResponseEntity<>(lokiService.getLogData(json), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package org.nl.modules.loki.service;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: lyd
|
|
||||||
* @Description: 服务类
|
|
||||||
* @Date: 2022-08-15
|
|
||||||
*/
|
|
||||||
public interface LokiService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取日志信息
|
|
||||||
* @param json
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
JSONObject getLogData(JSONObject json);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取labels和values树
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
JSONArray getLabelsValues();
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
package org.nl.modules.loki.service.impl;
|
|
||||||
|
|
||||||
import cn.hutool.core.util.CharsetUtil;
|
|
||||||
import cn.hutool.http.HttpUtil;
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.nl.modules.loki.service.LokiService;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: lyd
|
|
||||||
* @Description: 实现类
|
|
||||||
* @Date: 2022-08-15
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class LokiServiceImpl implements LokiService {
|
|
||||||
|
|
||||||
@Value("${loki.url}")
|
|
||||||
private String lokiUrl;
|
|
||||||
|
|
||||||
@Value("${loki.systemName}")
|
|
||||||
private String systemName;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSONObject getLogData(JSONObject json) {
|
|
||||||
String logLabel = "";
|
|
||||||
String logLabelValue = "";
|
|
||||||
Long start = 0L;
|
|
||||||
Long end = 0L;
|
|
||||||
String text = "";
|
|
||||||
String limit = "100";
|
|
||||||
String direction = "backward";
|
|
||||||
if (json.get("logLabel") != null) logLabel = json.getString("logLabel");
|
|
||||||
if (json.get("logLabelValue") != null) logLabelValue = json.getString("logLabelValue");
|
|
||||||
if (json.get("text") != null) text = json.getString("text");
|
|
||||||
if (json.get("start") != null) start = json.getLong("start");
|
|
||||||
if (json.get("end") != null) end = json.getLong("end");
|
|
||||||
if (json.get("limits") != null) limit = json.getString("limits");
|
|
||||||
if (json.get("direction") != null) direction = json.getString("direction");
|
|
||||||
/**
|
|
||||||
* 组织参数
|
|
||||||
* 纳秒数
|
|
||||||
* 1660037391880000000
|
|
||||||
* 1641453208415000000
|
|
||||||
* http://localhost:3100/loki/api/v1/query_range?query={host="localhost"} |= ``&limit=1500&start=1641453208415000000&end=1660027623419419002
|
|
||||||
*/
|
|
||||||
JSONObject parse = null;
|
|
||||||
String query = lokiUrl + "/query_range?query={system=\"" + systemName + "\", " + logLabel + "=\"" + logLabelValue + "\"} |= `" + text + "`";
|
|
||||||
String result = "";
|
|
||||||
if (start==0L) {
|
|
||||||
result = HttpUtil.get(query + "&limit=" + limit + "&direction=" + direction, CharsetUtil.CHARSET_UTF_8);
|
|
||||||
} else {
|
|
||||||
result = HttpUtil.get(query + "&limit=" + limit + "&start=" + start + "&end=" + end + "&direction=" + direction, CharsetUtil.CHARSET_UTF_8);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
parse = (JSONObject) JSONObject.parse(result);
|
|
||||||
} catch (Exception e) {
|
|
||||||
// reslut的值可能为:too many outstanding requests,无法转化成Json
|
|
||||||
System.out.println("reslut:" + result);
|
|
||||||
// e.printStackTrace();
|
|
||||||
}
|
|
||||||
return parse;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取labels和values树
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public JSONArray getLabelsValues() {
|
|
||||||
/**
|
|
||||||
* [{
|
|
||||||
* label:
|
|
||||||
* value:
|
|
||||||
* children:[{
|
|
||||||
* label
|
|
||||||
* value
|
|
||||||
* }]
|
|
||||||
* }]
|
|
||||||
*/
|
|
||||||
JSONArray result = new JSONArray();
|
|
||||||
// 获取所有标签
|
|
||||||
String labelString = HttpUtil.get(lokiUrl + "/labels", CharsetUtil.CHARSET_UTF_8);
|
|
||||||
JSONObject parse = (JSONObject) JSONObject.parse(labelString);
|
|
||||||
JSONArray labels = parse.getJSONArray("data");
|
|
||||||
for (int i=0; i<labels.size(); i++) {
|
|
||||||
// 获取标签下的所有值
|
|
||||||
String valueString = HttpUtil.get(lokiUrl + "/label/" + labels.getString(i) + "/values", CharsetUtil.CHARSET_UTF_8);
|
|
||||||
JSONObject parse2 = (JSONObject) JSONObject.parse(valueString);
|
|
||||||
JSONArray values = parse2.getJSONArray("data");
|
|
||||||
JSONArray children = new JSONArray();
|
|
||||||
// 组成树形状态 两级
|
|
||||||
for (int j=0; j<values.size(); j++) {
|
|
||||||
JSONObject leaf = new JSONObject();
|
|
||||||
leaf.put("label", values.getString(j));
|
|
||||||
leaf.put("value", values.getString(j));
|
|
||||||
children.add(leaf);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject node = new JSONObject();
|
|
||||||
node.put("label", labels.getString(i));
|
|
||||||
node.put("value", labels.getString(i));
|
|
||||||
node.put("children", children);
|
|
||||||
result.add(node);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -30,7 +30,6 @@ import java.util.Map;
|
|||||||
public class ParamController {
|
public class ParamController {
|
||||||
|
|
||||||
private final ParamService paramService;
|
private final ParamService paramService;
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@Log("查询系统参数")
|
@Log("查询系统参数")
|
||||||
@ApiOperation("查询系统参数")
|
@ApiOperation("查询系统参数")
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.nl.modules.system.service.impl;
|
package org.nl.modules.system.service.impl;
|
||||||
|
|
||||||
|
import com.esotericsoftware.minlog.Log;
|
||||||
import org.nl.modules.system.service.UserRelateService;
|
import org.nl.modules.system.service.UserRelateService;
|
||||||
import org.nl.modules.tools.MapOf;
|
import org.nl.modules.tools.MapOf;
|
||||||
import org.nl.modules.wql.core.bean.WQLObject;
|
import org.nl.modules.wql.core.bean.WQLObject;
|
||||||
@@ -30,6 +31,7 @@ public class UserRelateServiceImpl implements UserRelateService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void inserRoleRelate(Long user, Set<Long> RoleIds) {
|
public void inserRoleRelate(Long user, Set<Long> RoleIds) {
|
||||||
|
Log.info("");
|
||||||
if (user !=null && !CollectionUtils.isEmpty(RoleIds)){
|
if (user !=null && !CollectionUtils.isEmpty(RoleIds)){
|
||||||
for (Long roleid : RoleIds) {
|
for (Long roleid : RoleIds) {
|
||||||
WQLObject.getWQLObject("sys_users_roles").insert(MapOf.of("user_id",user,"role_id",roleid));
|
WQLObject.getWQLObject("sys_users_roles").insert(MapOf.of("user_id",user,"role_id",roleid));
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ package org.nl.system.controller.user;
|
|||||||
|
|
||||||
import cn.dev33.satoken.secure.SaSecureUtil;
|
import cn.dev33.satoken.secure.SaSecureUtil;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@@ -31,19 +29,15 @@ import org.nl.modules.common.exception.BadRequestException;
|
|||||||
import org.nl.modules.common.utils.RsaUtils;
|
import org.nl.modules.common.utils.RsaUtils;
|
||||||
import org.nl.modules.common.utils.SecurityUtils;
|
import org.nl.modules.common.utils.SecurityUtils;
|
||||||
import org.nl.modules.logging.annotation.Log;
|
import org.nl.modules.logging.annotation.Log;
|
||||||
import org.nl.modules.tools.IdUtil;
|
|
||||||
import org.nl.system.service.user.ISysUserService;
|
import org.nl.system.service.user.ISysUserService;
|
||||||
import org.nl.system.service.user.dao.SysUser;
|
import org.nl.system.service.user.dao.SysUser;
|
||||||
import org.nl.system.service.user.dto.SysUserDetail;
|
|
||||||
import org.nl.system.service.user.dto.UserQuery;
|
import org.nl.system.service.user.dto.UserQuery;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -60,7 +54,6 @@ public class UserController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
ISysUserService userService;
|
ISysUserService userService;
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation("查询用户")
|
@ApiOperation("查询用户")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public ResponseEntity<Object> query(UserQuery query, PageQuery page){
|
public ResponseEntity<Object> query(UserQuery query, PageQuery page){
|
||||||
|
|||||||
@@ -0,0 +1,585 @@
|
|||||||
|
package org.nl.system.service.quartz;
|
||||||
|
|
||||||
|
import org.quartz.SchedulerConfigException;
|
||||||
|
import org.quartz.spi.ThreadPool;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* quartz自定义线程池
|
||||||
|
*/
|
||||||
|
public class SimpleThreadPool implements ThreadPool {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* Data members.
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
private int count = -1;
|
||||||
|
|
||||||
|
private int prio = Thread.NORM_PRIORITY;
|
||||||
|
|
||||||
|
private boolean isShutdown = false;
|
||||||
|
private boolean handoffPending = false;
|
||||||
|
|
||||||
|
private boolean inheritLoader = false;
|
||||||
|
|
||||||
|
private boolean inheritGroup = true;
|
||||||
|
|
||||||
|
private boolean makeThreadsDaemons = false;
|
||||||
|
|
||||||
|
private ThreadGroup threadGroup;
|
||||||
|
|
||||||
|
private final Object nextRunnableLock = new Object();
|
||||||
|
|
||||||
|
private List<WorkerThread> workers;
|
||||||
|
private LinkedList<WorkerThread> availWorkers = new LinkedList<WorkerThread>();
|
||||||
|
private LinkedList<WorkerThread> busyWorkers = new LinkedList<WorkerThread>();
|
||||||
|
|
||||||
|
private String threadNamePrefix;
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
private String schedulerInstanceName;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* Constructors.
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Create a new (unconfigured) <code>SimpleThreadPool</code>.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @see #setThreadCount(int)
|
||||||
|
* @see #setThreadPriority(int)
|
||||||
|
*/
|
||||||
|
public SimpleThreadPool() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Create a new <code>SimpleThreadPool</code> with the specified number
|
||||||
|
* of <code>Thread</code> s that have the given priority.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param threadCount
|
||||||
|
* the number of worker <code>Threads</code> in the pool, must
|
||||||
|
* be > 0.
|
||||||
|
* @param threadPriority
|
||||||
|
* the thread priority for the worker threads.
|
||||||
|
*
|
||||||
|
* @see Thread
|
||||||
|
*/
|
||||||
|
public SimpleThreadPool(int threadCount, int threadPriority) {
|
||||||
|
setThreadCount(threadCount);
|
||||||
|
setThreadPriority(threadPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* Interface.
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Logger getLog() {
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPoolSize() {
|
||||||
|
return getThreadCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Set the number of worker threads in the pool - has no effect after
|
||||||
|
* <code>initialize()</code> has been called.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public void setThreadCount(int count) {
|
||||||
|
this.count = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Get the number of worker threads in the pool.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public int getThreadCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Set the thread priority of worker threads in the pool - has no effect
|
||||||
|
* after <code>initialize()</code> has been called.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public void setThreadPriority(int prio) {
|
||||||
|
this.prio = prio;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Get the thread priority of worker threads in the pool.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public int getThreadPriority() {
|
||||||
|
return prio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThreadNamePrefix(String prfx) {
|
||||||
|
this.threadNamePrefix = prfx;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getThreadNamePrefix() {
|
||||||
|
return threadNamePrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the
|
||||||
|
* threadsInheritContextClassLoaderOfInitializingThread.
|
||||||
|
*/
|
||||||
|
public boolean isThreadsInheritContextClassLoaderOfInitializingThread() {
|
||||||
|
return inheritLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param inheritLoader
|
||||||
|
* The threadsInheritContextClassLoaderOfInitializingThread to
|
||||||
|
* set.
|
||||||
|
*/
|
||||||
|
public void setThreadsInheritContextClassLoaderOfInitializingThread(
|
||||||
|
boolean inheritLoader) {
|
||||||
|
this.inheritLoader = inheritLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isThreadsInheritGroupOfInitializingThread() {
|
||||||
|
return inheritGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThreadsInheritGroupOfInitializingThread(
|
||||||
|
boolean inheritGroup) {
|
||||||
|
this.inheritGroup = inheritGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the value of makeThreadsDaemons.
|
||||||
|
*/
|
||||||
|
public boolean isMakeThreadsDaemons() {
|
||||||
|
return makeThreadsDaemons;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param makeThreadsDaemons
|
||||||
|
* The value of makeThreadsDaemons to set.
|
||||||
|
*/
|
||||||
|
public void setMakeThreadsDaemons(boolean makeThreadsDaemons) {
|
||||||
|
this.makeThreadsDaemons = makeThreadsDaemons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstanceId(String schedInstId) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstanceName(String schedName) {
|
||||||
|
schedulerInstanceName = schedName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize() throws SchedulerConfigException {
|
||||||
|
|
||||||
|
if(workers != null && workers.size() > 0) // already initialized...
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (count <= 0) {
|
||||||
|
throw new SchedulerConfigException(
|
||||||
|
"Thread count must be > 0");
|
||||||
|
}
|
||||||
|
if (prio <= 0 || prio > 9) {
|
||||||
|
throw new SchedulerConfigException(
|
||||||
|
"Thread priority must be > 0 and <= 9");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isThreadsInheritGroupOfInitializingThread()) {
|
||||||
|
threadGroup = Thread.currentThread().getThreadGroup();
|
||||||
|
} else {
|
||||||
|
// follow the threadGroup tree to the root thread group.
|
||||||
|
threadGroup = Thread.currentThread().getThreadGroup();
|
||||||
|
ThreadGroup parent = threadGroup;
|
||||||
|
while ( !parent.getName().equals("main") ) {
|
||||||
|
threadGroup = parent;
|
||||||
|
parent = threadGroup.getParent();
|
||||||
|
}
|
||||||
|
threadGroup = new ThreadGroup(parent, schedulerInstanceName + "-SimpleThreadPool");
|
||||||
|
if (isMakeThreadsDaemons()) {
|
||||||
|
threadGroup.setDaemon(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (isThreadsInheritContextClassLoaderOfInitializingThread()) {
|
||||||
|
getLog().info(
|
||||||
|
"Job execution threads will use class loader of thread: "
|
||||||
|
+ Thread.currentThread().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the worker threads and start them
|
||||||
|
Iterator<WorkerThread> workerThreads = createWorkerThreads(count).iterator();
|
||||||
|
while(workerThreads.hasNext()) {
|
||||||
|
WorkerThread wt = workerThreads.next();
|
||||||
|
wt.start();
|
||||||
|
availWorkers.add(wt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<WorkerThread> createWorkerThreads(int createCount) {
|
||||||
|
workers = new LinkedList<WorkerThread>();
|
||||||
|
for (int i = 1; i<= createCount; ++i) {
|
||||||
|
String threadPrefix = getThreadNamePrefix();
|
||||||
|
if (threadPrefix == null) {
|
||||||
|
threadPrefix = schedulerInstanceName + "_Worker";
|
||||||
|
}
|
||||||
|
WorkerThread wt = new WorkerThread(this, threadGroup,
|
||||||
|
threadPrefix + "-" + i,
|
||||||
|
getThreadPriority(),
|
||||||
|
isMakeThreadsDaemons());
|
||||||
|
if (isThreadsInheritContextClassLoaderOfInitializingThread()) {
|
||||||
|
wt.setContextClassLoader(Thread.currentThread()
|
||||||
|
.getContextClassLoader());
|
||||||
|
}
|
||||||
|
workers.add(wt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return workers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Terminate any worker threads in this thread group.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Jobs currently in progress will complete.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public void shutdown() {
|
||||||
|
shutdown(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Terminate any worker threads in this thread group.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Jobs currently in progress will complete.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public void shutdown(boolean waitForJobsToComplete) {
|
||||||
|
|
||||||
|
synchronized (nextRunnableLock) {
|
||||||
|
getLog().debug("Shutting down threadpool...");
|
||||||
|
|
||||||
|
isShutdown = true;
|
||||||
|
|
||||||
|
if(workers == null) // case where the pool wasn't even initialize()ed
|
||||||
|
return;
|
||||||
|
|
||||||
|
// signal each worker thread to shut down
|
||||||
|
Iterator<WorkerThread> workerThreads = workers.iterator();
|
||||||
|
while(workerThreads.hasNext()) {
|
||||||
|
WorkerThread wt = workerThreads.next();
|
||||||
|
wt.shutdown();
|
||||||
|
availWorkers.remove(wt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give waiting (wait(1000)) worker threads a chance to shut down.
|
||||||
|
// Active worker threads will shut down after finishing their
|
||||||
|
// current job.
|
||||||
|
nextRunnableLock.notifyAll();
|
||||||
|
|
||||||
|
if (waitForJobsToComplete == true) {
|
||||||
|
|
||||||
|
boolean interrupted = false;
|
||||||
|
try {
|
||||||
|
// wait for hand-off in runInThread to complete...
|
||||||
|
while(handoffPending) {
|
||||||
|
try {
|
||||||
|
nextRunnableLock.wait(100);
|
||||||
|
} catch(InterruptedException _) {
|
||||||
|
interrupted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait until all worker threads are shut down
|
||||||
|
while (busyWorkers.size() > 0) {
|
||||||
|
WorkerThread wt = (WorkerThread) busyWorkers.getFirst();
|
||||||
|
try {
|
||||||
|
getLog().debug(
|
||||||
|
"Waiting for thread " + wt.getName()
|
||||||
|
+ " to shut down");
|
||||||
|
|
||||||
|
// note: with waiting infinite time the
|
||||||
|
// application may appear to 'hang'.
|
||||||
|
nextRunnableLock.wait(2000);
|
||||||
|
} catch (InterruptedException _) {
|
||||||
|
interrupted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
workerThreads = workers.iterator();
|
||||||
|
while(workerThreads.hasNext()) {
|
||||||
|
WorkerThread wt = (WorkerThread) workerThreads.next();
|
||||||
|
try {
|
||||||
|
wt.join();
|
||||||
|
workerThreads.remove();
|
||||||
|
} catch (InterruptedException _) {
|
||||||
|
interrupted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (interrupted) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getLog().debug("No executing jobs remaining, all threads stopped.");
|
||||||
|
}
|
||||||
|
getLog().debug("Shutdown of threadpool complete.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Run the given <code>Runnable</code> object in the next available
|
||||||
|
* <code>Thread</code>. If while waiting the thread pool is asked to
|
||||||
|
* shut down, the Runnable is executed immediately within a new additional
|
||||||
|
* thread.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param runnable
|
||||||
|
* the <code>Runnable</code> to be added.
|
||||||
|
*/
|
||||||
|
public boolean runInThread(Runnable runnable) {
|
||||||
|
if (runnable == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized (nextRunnableLock) {
|
||||||
|
|
||||||
|
handoffPending = true;
|
||||||
|
|
||||||
|
// Wait until a worker thread is available
|
||||||
|
while ((availWorkers.size() < 1) && !isShutdown) {
|
||||||
|
try {
|
||||||
|
nextRunnableLock.wait(500);
|
||||||
|
} catch (InterruptedException ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isShutdown) {
|
||||||
|
WorkerThread wt = (WorkerThread)availWorkers.removeFirst();
|
||||||
|
busyWorkers.add(wt);
|
||||||
|
wt.run(runnable);
|
||||||
|
} else {
|
||||||
|
// If the thread pool is going down, execute the Runnable
|
||||||
|
// within a new additional worker thread (no thread from the pool).
|
||||||
|
WorkerThread wt = new WorkerThread(this, threadGroup,
|
||||||
|
"WorkerThread-LastJob", prio, isMakeThreadsDaemons(), runnable);
|
||||||
|
busyWorkers.add(wt);
|
||||||
|
workers.add(wt);
|
||||||
|
wt.start();
|
||||||
|
}
|
||||||
|
nextRunnableLock.notifyAll();
|
||||||
|
handoffPending = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int blockForAvailableThreads() {
|
||||||
|
synchronized(nextRunnableLock) {
|
||||||
|
|
||||||
|
while((availWorkers.size() < 1 || handoffPending) && !isShutdown) {
|
||||||
|
try {
|
||||||
|
nextRunnableLock.wait(500);
|
||||||
|
} catch (InterruptedException ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return availWorkers.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void makeAvailable(WorkerThread wt) {
|
||||||
|
synchronized(nextRunnableLock) {
|
||||||
|
if(!isShutdown) {
|
||||||
|
availWorkers.add(wt);
|
||||||
|
}
|
||||||
|
busyWorkers.remove(wt);
|
||||||
|
nextRunnableLock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void clearFromBusyWorkersList(WorkerThread wt) {
|
||||||
|
synchronized(nextRunnableLock) {
|
||||||
|
busyWorkers.remove(wt);
|
||||||
|
nextRunnableLock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* WorkerThread Class.
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* A Worker loops, waiting to execute tasks.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
class WorkerThread extends Thread {
|
||||||
|
|
||||||
|
private final Object lock = new Object();
|
||||||
|
|
||||||
|
// A flag that signals the WorkerThread to terminate.
|
||||||
|
private AtomicBoolean run = new AtomicBoolean(true);
|
||||||
|
|
||||||
|
private SimpleThreadPool tp;
|
||||||
|
|
||||||
|
private Runnable runnable = null;
|
||||||
|
|
||||||
|
private boolean runOnce = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Create a worker thread and start it. Waiting for the next Runnable,
|
||||||
|
* executing it, and waiting for the next Runnable, until the shutdown
|
||||||
|
* flag is set.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
WorkerThread(SimpleThreadPool tp, ThreadGroup threadGroup, String name,
|
||||||
|
int prio, boolean isDaemon) {
|
||||||
|
|
||||||
|
this(tp, threadGroup, name, prio, isDaemon, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Create a worker thread, start it, execute the runnable and terminate
|
||||||
|
* the thread (one time execution).
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
WorkerThread(SimpleThreadPool tp, ThreadGroup threadGroup, String name,
|
||||||
|
int prio, boolean isDaemon, Runnable runnable) {
|
||||||
|
|
||||||
|
super(threadGroup, name);
|
||||||
|
this.tp = tp;
|
||||||
|
this.runnable = runnable;
|
||||||
|
if(runnable != null)
|
||||||
|
runOnce = true;
|
||||||
|
setPriority(prio);
|
||||||
|
setDaemon(isDaemon);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Signal the thread that it should terminate.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
void shutdown() {
|
||||||
|
run.set(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(Runnable newRunnable) {
|
||||||
|
synchronized(lock) {
|
||||||
|
if(runnable != null) {
|
||||||
|
throw new IllegalStateException("Already running a Runnable!");
|
||||||
|
}
|
||||||
|
|
||||||
|
runnable = newRunnable;
|
||||||
|
lock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Loop, executing targets as they are received.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
boolean ran = false;
|
||||||
|
|
||||||
|
while (run.get()) {
|
||||||
|
try {
|
||||||
|
synchronized(lock) {
|
||||||
|
while (runnable == null && run.get()) {
|
||||||
|
lock.wait(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runnable != null) {
|
||||||
|
ran = true;
|
||||||
|
runnable.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InterruptedException unblock) {
|
||||||
|
// do nothing (loop will terminate if shutdown() was called
|
||||||
|
try {
|
||||||
|
getLog().error("Worker thread was interrupt()'ed.", unblock);
|
||||||
|
} catch(Exception e) {
|
||||||
|
// ignore to help with a tomcat glitch
|
||||||
|
}
|
||||||
|
} catch (Throwable exceptionInRunnable) {
|
||||||
|
try {
|
||||||
|
getLog().error("Error while executing the Runnable: ",
|
||||||
|
exceptionInRunnable);
|
||||||
|
} catch(Exception e) {
|
||||||
|
// ignore to help with a tomcat glitch
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
synchronized(lock) {
|
||||||
|
runnable = null;
|
||||||
|
}
|
||||||
|
// repair the thread in case the runnable mucked it up...
|
||||||
|
if(getPriority() != tp.getThreadPriority()) {
|
||||||
|
setPriority(tp.getThreadPriority());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runOnce) {
|
||||||
|
run.set(false);
|
||||||
|
clearFromBusyWorkersList(this);
|
||||||
|
} else if(ran) {
|
||||||
|
ran = false;
|
||||||
|
makeAvailable(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (log.isDebugEnabled())
|
||||||
|
try {
|
||||||
|
getLog().debug("WorkerThread is shut down.");
|
||||||
|
} catch(Exception e) {
|
||||||
|
// ignore to help with a tomcat glitch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.nl.system.service.quartz.config;
|
package org.nl.system.service.quartz.config;
|
||||||
|
|
||||||
|
import com.dtp.core.thread.DtpExecutor;
|
||||||
import org.quartz.Scheduler;
|
import org.quartz.Scheduler;
|
||||||
import org.quartz.spi.TriggerFiredBundle;
|
import org.quartz.spi.TriggerFiredBundle;
|
||||||
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
|
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
|
||||||
@@ -21,7 +22,7 @@ public class QuartzConfig {
|
|||||||
* 解决Job中注入Spring Bean为null的问题
|
* 解决Job中注入Spring Bean为null的问题
|
||||||
*/
|
*/
|
||||||
@Component("quartzJobFactory")
|
@Component("quartzJobFactory")
|
||||||
public static class QuartzJobFactory extends AdaptableJobFactory {
|
public class QuartzJobFactory extends AdaptableJobFactory {
|
||||||
|
|
||||||
private final AutowireCapableBeanFactory capableBeanFactory;
|
private final AutowireCapableBeanFactory capableBeanFactory;
|
||||||
|
|
||||||
@@ -46,8 +47,9 @@ public class QuartzConfig {
|
|||||||
* @throws Exception /
|
* @throws Exception /
|
||||||
*/
|
*/
|
||||||
@Bean(name = "scheduler")
|
@Bean(name = "scheduler")
|
||||||
public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
|
public Scheduler scheduler(QuartzJobFactory quartzJobFactory, DtpExecutor e) throws Exception {
|
||||||
SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
|
SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
|
||||||
|
factoryBean.setTaskExecutor(e);
|
||||||
factoryBean.setJobFactory(quartzJobFactory);
|
factoryBean.setJobFactory(quartzJobFactory);
|
||||||
factoryBean.afterPropertiesSet();
|
factoryBean.afterPropertiesSet();
|
||||||
Scheduler scheduler=factoryBean.getScheduler();
|
Scheduler scheduler=factoryBean.getScheduler();
|
||||||
|
|||||||
@@ -1,120 +0,0 @@
|
|||||||
# 端口
|
|
||||||
server:
|
|
||||||
port: 9000
|
|
||||||
|
|
||||||
# Sa-Token 配置
|
|
||||||
sa-token:
|
|
||||||
# ------- SSO-模式一相关配置 (非模式一不需要配置)
|
|
||||||
|
|
||||||
# 配置 Cookie 作用域
|
|
||||||
|
|
||||||
# ------- SSO-模式二相关配置
|
|
||||||
sso:
|
|
||||||
# Ticket有效期 (单位: 秒),默认五分钟
|
|
||||||
ticket-timeout: 300
|
|
||||||
# 所有允许的授权回调地址比较重要
|
|
||||||
allow-url: "*"
|
|
||||||
# 是否打开单点注销功能
|
|
||||||
is-slo: true
|
|
||||||
# ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开)
|
|
||||||
# # 是否打开模式三
|
|
||||||
isHttp: true
|
|
||||||
# # 接口调用秘钥(用于SSO模式三的单点注销功能)
|
|
||||||
secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
|
|
||||||
token-name: EL-ADMIN-TOEKN
|
|
||||||
# # ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器(文档有步骤说明)
|
|
||||||
#
|
|
||||||
spring:
|
|
||||||
#配置 Jpa
|
|
||||||
jpa:
|
|
||||||
hibernate:
|
|
||||||
ddl-auto: none
|
|
||||||
open-in-view: true
|
|
||||||
properties:
|
|
||||||
hibernate:
|
|
||||||
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
|
||||||
enable_lazy_load_no_trans: true
|
|
||||||
# 数据源
|
|
||||||
datasource:
|
|
||||||
druid:
|
|
||||||
db-type: com.alibaba.druid.pool.DruidDataSource
|
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
|
||||||
# url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:whxr_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
|
||||||
url: jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
|
||||||
username: ${DB_USER:root}
|
|
||||||
password: ${DB_PWD:P@ssw0rd}
|
|
||||||
# username: ${DB_USER:root}
|
|
||||||
# password: ${DB_PWD:root}
|
|
||||||
# 初始连接数
|
|
||||||
initial-size: 5
|
|
||||||
# 最小连接数
|
|
||||||
min-idle: 15
|
|
||||||
# 最大连接数
|
|
||||||
max-active: 30
|
|
||||||
# 是否自动回收超时连接
|
|
||||||
remove-abandoned: true
|
|
||||||
# 超时时间(以秒数为单位)
|
|
||||||
remove-abandoned-timeout: 180
|
|
||||||
# 获取连接超时时间
|
|
||||||
max-wait: 300
|
|
||||||
# 连接有效性检测时间
|
|
||||||
time-between-eviction-runs-millis: 60000
|
|
||||||
# 连接在池中最小生存的时间
|
|
||||||
min-evictable-idle-time-millis: 300000
|
|
||||||
# 连接在池中最大生存的时间
|
|
||||||
max-evictable-idle-time-millis: 900000
|
|
||||||
# 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除
|
|
||||||
test-while-idle: true
|
|
||||||
# 指明是否在从池中取出连接前进行检验,如果检验失败, 则从池中去除连接并尝试取出另一个
|
|
||||||
test-on-borrow: true
|
|
||||||
# 是否在归还到池中前进行检验
|
|
||||||
test-on-return: false
|
|
||||||
# 检测连接是否有效
|
|
||||||
validation-query: select 1
|
|
||||||
# 配置监控统计
|
|
||||||
# webStatFilter:
|
|
||||||
# enabled: true
|
|
||||||
# stat-view-servlet:
|
|
||||||
# enabled: true
|
|
||||||
# url-pattern: /druid/*
|
|
||||||
# reset-enable: false
|
|
||||||
# filter:
|
|
||||||
# stat:
|
|
||||||
# enabled: true
|
|
||||||
# # 记录慢SQL
|
|
||||||
# log-slow-sql: true
|
|
||||||
# slow-sql-millis: 1000
|
|
||||||
# merge-sql: true
|
|
||||||
# wall:
|
|
||||||
# config:
|
|
||||||
# multi-statement-allow: true
|
|
||||||
|
|
||||||
# Redis配置 (SSO模式一和模式二使用Redis来同步会话)
|
|
||||||
redis:
|
|
||||||
# Redis数据库索引(默认为0)
|
|
||||||
database: 1
|
|
||||||
# Redis服务器地址
|
|
||||||
host: 47.96.133.178
|
|
||||||
# Redis服务器连接端口
|
|
||||||
port: 6479
|
|
||||||
# Redis服务器连接密码(默认为空)
|
|
||||||
password: 942464Yy
|
|
||||||
# 连接超时时间
|
|
||||||
timeout: 10s
|
|
||||||
lettuce:
|
|
||||||
pool:
|
|
||||||
# 连接池最大连接数
|
|
||||||
max-active: 200
|
|
||||||
# 连接池最大阻塞等待时间(使用负值表示没有限制)
|
|
||||||
max-wait: -1ms
|
|
||||||
# 连接池中的最大空闲连接
|
|
||||||
max-idle: 10
|
|
||||||
# 连接池中的最小空闲连接
|
|
||||||
min-idle: 0
|
|
||||||
|
|
||||||
forest:
|
|
||||||
# 关闭 forest 请求日志打印
|
|
||||||
log-enabled: false
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -6,10 +6,10 @@ spring:
|
|||||||
druid:
|
druid:
|
||||||
db-type: com.alibaba.druid.pool.DruidDataSource
|
db-type: com.alibaba.druid.pool.DruidDataSource
|
||||||
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
||||||
url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:nl-sso-server}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:nl-sso-server}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
||||||
# url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:yongyu_lms2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nl_platform}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
||||||
username: ${DB_USER:root}
|
username: ${DB_USER:root}
|
||||||
password: ${DB_PWD:Root.123456}
|
password: ${DB_PWD:root}
|
||||||
# password: ${DB_PWD:12356}
|
# password: ${DB_PWD:12356}
|
||||||
# 初始连接数
|
# 初始连接数
|
||||||
initial-size: 5
|
initial-size: 5
|
||||||
@@ -57,8 +57,75 @@ spring:
|
|||||||
database: ${REDIS_DB:2}
|
database: ${REDIS_DB:2}
|
||||||
host: ${REDIS_HOST:127.0.0.1}
|
host: ${REDIS_HOST:127.0.0.1}
|
||||||
port: ${REDIS_PORT:6379}
|
port: ${REDIS_PORT:6379}
|
||||||
password: ${REDIS_PWD:}
|
flyway: # flyway 数据库 DDL 版本控制
|
||||||
|
enabled: true # 正式环境才开启
|
||||||
|
clean-disabled: true # 禁用数据库清理
|
||||||
|
encoding: UTF-8
|
||||||
|
locations: classpath:db
|
||||||
|
# flyway 会在库中创建此名称元数据表,用于记录所有版本演化和状态,同一个库不同项目可能冲突,每个项目一张表来记录
|
||||||
|
table: flyway_schema_history_nl_platform #TODO 值的后缀指定为当前项目名称
|
||||||
|
baseline-version: 1 # 基线版本默认开始序号 默认为 1
|
||||||
|
baseline-on-migrate: true # 针对非空数据库是否默认调用基线版本,为空的话默认会调用基线版本
|
||||||
|
placeholders: # 定义 afterMigrateError.sql 要清理的元数据表表名
|
||||||
|
flyway-table: ${spring.flyway.table}
|
||||||
|
dynamic:
|
||||||
|
tp:
|
||||||
|
enabled: true
|
||||||
|
enabledBanner: true # 是否开启banner打印,默认true
|
||||||
|
enabledCollect: true # 是否开启监控指标采集,默认false
|
||||||
|
collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer
|
||||||
|
logPath: /home/logs888 # 监控日志数据路径,默认 ${user.home}/logs
|
||||||
|
monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s
|
||||||
|
tomcatTp: # tomcat web server线程池配置
|
||||||
|
corePoolSize: 100
|
||||||
|
maximumPoolSize: 400
|
||||||
|
keepAliveTime: 60
|
||||||
|
executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量
|
||||||
|
- threadPoolName: dtpExecutor1
|
||||||
|
executorType: common # 线程池类型common、eager:适用于io密集型
|
||||||
|
corePoolSize: 6
|
||||||
|
maximumPoolSize: 8
|
||||||
|
queueCapacity: 200
|
||||||
|
queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类
|
||||||
|
rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类
|
||||||
|
keepAliveTime: 50
|
||||||
|
allowCoreThreadTimeOut: false # 是否允许核心线程池超时
|
||||||
|
threadNamePrefix: test # 线程名前缀
|
||||||
|
waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池
|
||||||
|
awaitTerminationSeconds: 5 # 单位(s)
|
||||||
|
preStartAllCoreThreads: false # 是否预热所有核心线程,默认false
|
||||||
|
runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms)
|
||||||
|
queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms)
|
||||||
|
taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口
|
||||||
|
notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警)
|
||||||
|
- type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类
|
||||||
|
enabled: true
|
||||||
|
threshold: 80 # 报警阈值
|
||||||
|
platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台
|
||||||
|
interval: 120 # 报警间隔(单位:s)
|
||||||
|
- type: change
|
||||||
|
enabled: true
|
||||||
|
- type: liveness
|
||||||
|
enabled: true
|
||||||
|
threshold: 80
|
||||||
|
- type: reject
|
||||||
|
enabled: true
|
||||||
|
threshold: 1
|
||||||
|
- type: run_timeout
|
||||||
|
enabled: true
|
||||||
|
threshold: 1
|
||||||
|
- type: queue_timeout
|
||||||
|
enabled: true
|
||||||
|
threshold: 1
|
||||||
|
quartz:
|
||||||
|
properties:
|
||||||
|
org:
|
||||||
|
quartz:
|
||||||
|
jobStore:
|
||||||
|
threadPool:
|
||||||
|
threadCount: 14
|
||||||
|
class: org.nl.system.service.quartz.SimpleThreadPool
|
||||||
|
scheduler-name: scheduler
|
||||||
# 登录相关配置
|
# 登录相关配置
|
||||||
login:
|
login:
|
||||||
# 登录缓存
|
# 登录缓存
|
||||||
@@ -160,9 +227,4 @@ sa-token:
|
|||||||
# Redis服务器连接密码(默认为空)
|
# Redis服务器连接密码(默认为空)
|
||||||
password:
|
password:
|
||||||
# 连接超时时间
|
# 连接超时时间
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
|
|
||||||
|
|
||||||
loki:
|
|
||||||
url: http://localhost:3100/loki/api/v1
|
|
||||||
systemName: acs
|
|
||||||
@@ -56,7 +56,6 @@ spring:
|
|||||||
database: ${REDIS_DB:15}
|
database: ${REDIS_DB:15}
|
||||||
host: ${REDIS_HOST:127.0.0.1}
|
host: ${REDIS_HOST:127.0.0.1}
|
||||||
port: ${REDIS_PORT:6379}
|
port: ${REDIS_PORT:6379}
|
||||||
password: ${REDIS_PWD:}
|
|
||||||
#连接超时时间
|
#连接超时时间
|
||||||
timeout: 5000
|
timeout: 5000
|
||||||
# 登录相关配置
|
# 登录相关配置
|
||||||
@@ -159,7 +158,3 @@ sa-token:
|
|||||||
token-prefix: Bearer
|
token-prefix: Bearer
|
||||||
is-read-cookie: false
|
is-read-cookie: false
|
||||||
is-read-body: false
|
is-read-body: false
|
||||||
|
|
||||||
loki:
|
|
||||||
url: http://localhost:3100/loki/api/v1
|
|
||||||
systemName: lms
|
|
||||||
|
|||||||
@@ -156,8 +156,4 @@ sa-token:
|
|||||||
is-log: false
|
is-log: false
|
||||||
jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq
|
jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq
|
||||||
# token 前缀
|
# token 前缀
|
||||||
token-prefix: Bearer
|
token-prefix: Bearer
|
||||||
|
|
||||||
loki:
|
|
||||||
url: http://localhost:3100/loki/api/v1
|
|
||||||
systemName: lms
|
|
||||||
@@ -9,44 +9,22 @@ spring:
|
|||||||
redis:
|
redis:
|
||||||
repositories:
|
repositories:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
#密码加密传输,前端公钥加密,后端私钥解密
|
||||||
#配置 Jpa
|
rsa:
|
||||||
jpa:
|
private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
|
||||||
hibernate:
|
logging:
|
||||||
ddl-auto: none
|
config: classpath:logback-spring.xml
|
||||||
open-in-view: true
|
# sa-token白名单配置
|
||||||
properties:
|
|
||||||
hibernate:
|
|
||||||
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
|
||||||
enable_lazy_load_no_trans: true
|
|
||||||
task:
|
task:
|
||||||
pool:
|
pool:
|
||||||
# 核心线程池大小
|
# 核心线程池大小
|
||||||
core-pool-size: 10
|
core-pool-size: 12
|
||||||
# 最大线程数
|
# 最大线程数
|
||||||
max-pool-size: 30
|
max-pool-size: 30
|
||||||
# 活跃时间
|
# 活跃时间
|
||||||
keep-alive-seconds: 60
|
keep-alive-seconds: 60
|
||||||
# 队列容量
|
# 队列容量
|
||||||
queue-capacity: 50
|
queue-capacity: 50
|
||||||
|
|
||||||
#七牛云
|
|
||||||
qiniu:
|
|
||||||
# 文件大小 /M
|
|
||||||
max-size: 15
|
|
||||||
|
|
||||||
#邮箱验证码有效时间/秒
|
|
||||||
code:
|
|
||||||
expiration: 300
|
|
||||||
|
|
||||||
#密码加密传输,前端公钥加密,后端私钥解密
|
|
||||||
rsa:
|
|
||||||
private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
|
|
||||||
logging:
|
|
||||||
file:
|
|
||||||
path: C:\log\wms
|
|
||||||
config: classpath:logback-spring.xml
|
|
||||||
# sa-token白名单配置
|
|
||||||
security:
|
security:
|
||||||
# 排除路径
|
# 排除路径
|
||||||
excludes:
|
excludes:
|
||||||
@@ -80,12 +58,35 @@ security:
|
|||||||
- /api/localStorage/pictures
|
- /api/localStorage/pictures
|
||||||
# 参数
|
# 参数
|
||||||
- /api/param/getValueByCode
|
- /api/param/getValueByCode
|
||||||
|
- /plumelog/**
|
||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
configuration:
|
configuration:
|
||||||
map-underscore-to-camel-case: true
|
map-underscore-to-camel-case: true
|
||||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
|
||||||
mapper-locations:
|
mapper-locations:
|
||||||
- classpath:org.nl.**.mapper/*.xml
|
- classpath:org.nl.**.mapper/*.xml
|
||||||
global-config:
|
global-config:
|
||||||
db-config:
|
db-config:
|
||||||
id-type: INPUT
|
id-type: INPUT
|
||||||
|
plumelog:
|
||||||
|
model: redis #值为4种 redis,kafka,rest,restServer,lite
|
||||||
|
lite:
|
||||||
|
log:
|
||||||
|
path: /lucene2
|
||||||
|
redisson:
|
||||||
|
# redis key前缀
|
||||||
|
keyPrefix:
|
||||||
|
# 线程池数量
|
||||||
|
threads: 4
|
||||||
|
# Netty线程池数量
|
||||||
|
nettyThreads: 8
|
||||||
|
# 单节点配置
|
||||||
|
singleServerConfig:
|
||||||
|
# 最小空闲连接数
|
||||||
|
connectionMinimumIdleSize: 4
|
||||||
|
# 连接池大小
|
||||||
|
connectionPoolSize: 8
|
||||||
|
# 连接空闲超时,单位:毫秒
|
||||||
|
idleConnectionTimeout: 10000
|
||||||
|
# 命令等待超时,单位:毫秒
|
||||||
|
timeout: 3000
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
CREATE TABLE `t_javastack` (
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`name` varchar(20) NOT NULL COMMENT '姓名',
|
||||||
|
`age` int(5) DEFAULT NULL COMMENT '年龄',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
CREATE TABLE `t_javastack` (
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`name` varchar(20) NOT NULL COMMENT '姓名',
|
||||||
|
`age` int(5) DEFAULT NULL COMMENT '年龄',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
CREATE TABLE `t2_javastack` (
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`name` varchar(20) NOT NULL COMMENT '姓名',
|
||||||
|
`age` int(5) DEFAULT NULL COMMENT '年龄',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
|
|
||||||
@@ -14,9 +14,6 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<property name="log.pattern"
|
<property name="log.pattern"
|
||||||
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
|
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
|
||||||
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
||||||
<springProperty scope="context" name="lokiUrl" source="loki.url"/>
|
|
||||||
<springProperty scope="context" name="systemName" source="loki.systemName"/>
|
|
||||||
<property name="LOKI_URL" value="${lokiUrl}"/>
|
|
||||||
<property name="SYSTEM_NAME" value="${systemName}"/>
|
<property name="SYSTEM_NAME" value="${systemName}"/>
|
||||||
<property name="LOG_HOME" value="${logPath}"/>
|
<property name="LOG_HOME" value="${logPath}"/>
|
||||||
<!--引入默认的一些设置-->
|
<!--引入默认的一些设置-->
|
||||||
@@ -58,28 +55,20 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<appender-ref ref="FILE"/>
|
<appender-ref ref="FILE"/>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!--添加loki-->
|
<appender name="plumelog" class="com.plumelog.lite.logback.appender.LiteAppender">
|
||||||
<appender name="lokiAppender" class="com.github.loki4j.logback.Loki4jAppender">
|
<appName>plumelog</appName>
|
||||||
<batchTimeoutMs>1000</batchTimeoutMs>
|
<!-- 日志存储位置 -->
|
||||||
<http class="com.github.loki4j.logback.ApacheHttpSender">
|
<logPath>/plumelog/lite</logPath>
|
||||||
<url>${LOKI_URL}/push</url>
|
<!-- 日志保留天数 -->
|
||||||
</http>
|
<keepDay>30</keepDay>
|
||||||
<format>
|
<expand>sleuth</expand>
|
||||||
<label>
|
|
||||||
<pattern>system=${SYSTEM_NAME},level=%level,logType=%X{log_file_type:-logType}</pattern>
|
|
||||||
</label>
|
|
||||||
<message>
|
|
||||||
<pattern>${log.pattern}</pattern>
|
|
||||||
</message>
|
|
||||||
<sortByTime>true</sortByTime>
|
|
||||||
</format>
|
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!--开发环境:打印控制台-->
|
<!--开发环境:打印控制台-->
|
||||||
<springProfile name="dev">
|
<springProfile name="dev">
|
||||||
<root level="debug">
|
<root level="debug">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
<appender-ref ref="lokiAppender" />
|
<appender-ref ref="plumelog" />
|
||||||
</root>
|
</root>
|
||||||
<logger name="org.springframework" level="ERROR" additivity="false">
|
<logger name="org.springframework" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
@@ -124,55 +113,55 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<springProfile name="prod">
|
<springProfile name="prod">
|
||||||
<root level="debug">
|
<root level="debug">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</root>
|
</root>
|
||||||
<logger name="org.springframework" level="ERROR" additivity="false">
|
<logger name="org.springframework" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="org.apache" level="ERROR" additivity="false">
|
<logger name="org.apache" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="org.hibernate" level="ERROR" additivity="false">
|
<logger name="org.hibernate" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="io.netty" level="ERROR" additivity="false">
|
<logger name="io.netty" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="jdbc" level="ERROR" additivity="false">
|
<logger name="jdbc" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="io.lettuce" level="ERROR" additivity="false">
|
<logger name="io.lettuce" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="com.fasterxml" level="ERROR" additivity="false">
|
<logger name="com.fasterxml" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="org.quartz" level="ERROR" additivity="false">
|
<logger name="org.quartz" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="com.google" level="ERROR" additivity="false">
|
<logger name="com.google" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="springfox" level="ERROR" additivity="false">
|
<logger name="springfox" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="log4jdbc" level="ERROR" additivity="false">
|
<logger name="log4jdbc" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="nl.basjes" level="ERROR" additivity="false">
|
<logger name="nl.basjes" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
</springProfile>
|
</springProfile>
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>nlsso-server</module>
|
<module>nlsso-server</module>
|
||||||
<module>nlsso-client</module>
|
|
||||||
</modules>
|
</modules>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<groupId>org.nl</groupId>
|
<groupId>org.nl</groupId>
|
||||||
@@ -22,9 +21,6 @@
|
|||||||
<sa-token.version>1.31.0</sa-token.version>
|
<sa-token.version>1.31.0</sa-token.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
Reference in New Issue
Block a user