@@ -0,0 +1,10 @@ | |||||
FROM java:8 | |||||
MAINTAINER king <1609724385@qq.com> | |||||
VOLUME /tmp | |||||
COPY /target/iotgatewayservice.jar iotgatewayservice.jar | |||||
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas | |||||
ENV TimeZone=Asia/Shanghai | |||||
ENV active=dev | |||||
ENV JAVA_OPTS="-Xmx512M -Xms512M" | |||||
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone | |||||
ENTRYPOINT java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /iotgatewayservice.jar --spring.profiles.active=$active |
@@ -0,0 +1,234 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xmlns="http://maven.apache.org/POM/4.0.0" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>com.telpo</groupId> | |||||
<artifactId>iotgatewayservice</artifactId> | |||||
<version>1.0-SNAPSHOT</version> | |||||
<name>data-iot-gateway-server</name> | |||||
<description>数据推送服务</description> | |||||
<packaging>jar</packaging> | |||||
<properties> | |||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||||
<java.version>1.8</java.version> | |||||
<maven.compiler.encoding>UTF-8</maven.compiler.encoding> | |||||
<spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version> | |||||
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> | |||||
<skipTests>true</skipTests> | |||||
</properties> | |||||
<parent> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-parent</artifactId> | |||||
<version>2.2.5.RELEASE</version> | |||||
</parent> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-devtools</artifactId> | |||||
<scope>runtime</scope> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
<!--天波通用包--> | |||||
<dependency> | |||||
<groupId>com.telpo</groupId> | |||||
<artifactId>common</artifactId> | |||||
<version>1.1.19</version> | |||||
</dependency> | |||||
<!-- amqp 1.0 qpid client --> | |||||
<dependency> | |||||
<groupId>org.apache.qpid</groupId> | |||||
<artifactId>qpid-jms-client</artifactId> | |||||
<version>0.47.0</version> | |||||
</dependency> | |||||
<!-- util for base64--> | |||||
<dependency> | |||||
<groupId>commons-codec</groupId> | |||||
<artifactId>commons-codec</artifactId> | |||||
<version>1.10</version> | |||||
</dependency> | |||||
<!-- springcloud alibaba依赖包--> | |||||
<dependency> | |||||
<groupId>com.alibaba.cloud</groupId> | |||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba.cloud</groupId> | |||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> | |||||
</dependency> | |||||
<!-- springcloud 依赖包--> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-web</artifactId> | |||||
</dependency> | |||||
<!--MySQL 连接驱动依赖--> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
<scope>runtime</scope> | |||||
</dependency> | |||||
<!--mybatis-plus数据持久层--> | |||||
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus --> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus</artifactId> | |||||
<version>3.3.1</version> | |||||
</dependency> | |||||
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-autoconfigure --> | |||||
<dependency> | |||||
<groupId>org.mybatis.spring.boot</groupId> | |||||
<artifactId>mybatis-spring-boot-autoconfigure</artifactId> | |||||
<version>2.1.2</version> | |||||
</dependency> | |||||
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> | |||||
<dependency> | |||||
<groupId>org.mybatis.spring.boot</groupId> | |||||
<artifactId>mybatis-spring-boot-starter</artifactId> | |||||
<version>2.1.2</version> | |||||
</dependency> | |||||
<!--druid数据连接池--> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>druid-spring-boot-starter</artifactId> | |||||
<version>1.1.22</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
<scope>test</scope> | |||||
<exclusions> | |||||
<exclusion> | |||||
<groupId>org.junit.vintage</groupId> | |||||
<artifactId>junit-vintage-engine</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-configuration-processor</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-lang3</artifactId> | |||||
<version>3.10</version> | |||||
</dependency> | |||||
<!-- AOP--> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-aop</artifactId> | |||||
</dependency> | |||||
<!-- LocalDateTime 序列化--> | |||||
<dependency> | |||||
<groupId>com.fasterxml.jackson.datatype</groupId> | |||||
<artifactId>jackson-datatype-jsr310</artifactId> | |||||
</dependency> | |||||
<!-- 开启redis缓存 --> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-data-redis</artifactId> | |||||
</dependency> | |||||
<!-- redis依赖commons-pool 这个依赖一定要添加 --> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-pool2</artifactId> | |||||
</dependency> | |||||
<!--kafka 依赖--> | |||||
<dependency> | |||||
<groupId>org.springframework.kafka</groupId> | |||||
<artifactId>spring-kafka</artifactId> | |||||
</dependency> | |||||
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> | |||||
<dependency> | |||||
<groupId>com.squareup.okhttp3</groupId> | |||||
<artifactId>okhttp</artifactId> | |||||
<version>4.8.0</version> | |||||
</dependency> | |||||
<!-- https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-starter-client --> | |||||
<dependency> | |||||
<groupId>de.codecentric</groupId> | |||||
<artifactId>spring-boot-admin-starter-client</artifactId> | |||||
<version>2.2.4</version> | |||||
</dependency> | |||||
</dependencies> | |||||
<dependencyManagement> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.cloud</groupId> | |||||
<artifactId>spring-cloud-dependencies</artifactId> | |||||
<version>${spring-cloud.version}</version> | |||||
<type>pom</type> | |||||
<scope>import</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba.cloud</groupId> | |||||
<artifactId>spring-cloud-alibaba-dependencies</artifactId> | |||||
<version>${spring-cloud-alibaba.version}</version> | |||||
<type>pom</type> | |||||
<scope>import</scope> | |||||
</dependency> | |||||
</dependencies> | |||||
</dependencyManagement> | |||||
<build> | |||||
<finalName>${project.artifactId}</finalName> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-maven-plugin</artifactId> | |||||
<configuration> | |||||
<!--fork : 使用 devtools生效--> | |||||
<fork>true</fork> | |||||
</configuration> | |||||
<executions> | |||||
<execution> | |||||
<goals> | |||||
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中--> | |||||
</goals> | |||||
</execution> | |||||
</executions> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
</project> |
@@ -0,0 +1,39 @@ | |||||
#!/bin/bash | |||||
environment=$1 | |||||
version=$2 | |||||
echo "环境变量为$environment,版本为$version!" | |||||
if [[ $environment == 'pro' ]]; then | |||||
echo "开始远程构建容器" | |||||
docker stop iot_gateway_service || true | |||||
docker rm iot_gateway_service || true | |||||
docker rmi -f $(docker images | grep registry.cn-shanghai.aliyuncs.com/telpo_platform/iot_gateway_service | awk '{print $3}') | |||||
docker login --username=rzl_wangjx@1111649216405698 --password=telpo.123 registry.cn-shanghai.aliyuncs.com | |||||
docker pull registry.cn-shanghai.aliyuncs.com/telpo_platform/iot_gateway_service:$version | |||||
docker run -v /home/data/iotgatewayserver/log:/var/log/iotgatewayserver -e active=pro --restart=always -d --network host --name iot_gateway_service registry.cn-shanghai.aliyuncs.com/telpo_platform/iot_gateway_service:$version | |||||
#删除产生的None镜像 | |||||
docker rmi -f $(docker images | grep none | awk '{print $3}') | |||||
docker ps -a | |||||
else | |||||
if [[ $environment == 'test' ]]; then | |||||
#echo "开始远程构建容器" | |||||
docker stop iot_gateway_service || true | |||||
docker rm iot_gateway_service || true | |||||
docker rmi -f $(docker images | grep 139.224.254.18:5000/iot_gateway_service | awk '{print $3}') | |||||
docker pull 139.224.254.18:5000/iot_gateway_service:$version | |||||
docker run -v /home/data/iotgatewayserver/log:/var/log/iotgatewayserver -e active=test --restart=always -d --network host --name iot_gateway_service 139.224.254.18:5000/iot_gateway_service:$version | |||||
#删除产生的None镜像 | |||||
docker rmi -f $(docker images | grep none | awk '{print $3}') | |||||
docker ps -a | |||||
else | |||||
docker stop iot_gateway_service || true | |||||
docker rm iot_gateway_service || true | |||||
docker rmi -f $(docker images | grep 139.224.254.18:5000/iot_gateway_service | awk '{print $3}') | |||||
docker pull 139.224.254.18:5000/iot_gateway_service:$version | |||||
docker run -v /home/data/iotgatewayserver/log:/var/log/iotgatewayserver -e active=dev --restart=always -d --network host --name iot_gateway_service telpo/iot_gateway_service:$version | |||||
#删除产生的None镜像 | |||||
docker rmi -f $(docker images | grep none | awk '{print $3}') | |||||
docker ps -a | |||||
fi | |||||
fi |
@@ -0,0 +1,26 @@ | |||||
#!/bin/bash | |||||
mvn clean | |||||
mvn package -Dmaven.test.skip=true | |||||
#image_version=$(date +%Y%m%d%H%M) | |||||
image_version=$version | |||||
docker stop iot_gateway_service || true | |||||
docker rm iot_gateway_service || true | |||||
# 删除镜像 | |||||
docker rmi -f $(docker images | grep telpo/iot_gateway_service | awk '{print $3}') | |||||
docker build . -t telpo/push_service:$image_version | |||||
#TODO:推送镜像到私有仓库 | |||||
echo '=================开始推送镜像=======================' | |||||
docker tag telpo/iot_gateway_service:$image_version 139.224.254.18:5000/iot_gateway_service:$image_version | |||||
docker push 139.224.254.18:5000/iot_gateway_service:$image_version | |||||
echo '=================推送镜像完成=======================' | |||||
#删除产生的None镜像 | |||||
docker rmi -f $(docker images | grep none | awk '{print $3}') | |||||
# 查看镜像列表 | |||||
docker images | |||||
# 启动容器 | |||||
docker run -v /home/data/iotgatewayserver/log:/var/log/iotgatewayserver -d -e active=dev --network host --restart=always --name iot_gateway_service telpo/iot_gateway_service:$image_version | |||||
# 查看日志 | |||||
docker logs push_service |
@@ -0,0 +1,20 @@ | |||||
#!/usr/bin/env bash | |||||
mvn clean | |||||
mvn package -Dmaven.test.skip=true | |||||
image_version=$version | |||||
# 删除镜像 | |||||
docker rmi -f $( | |||||
docker images | grep registry.cn-shanghai.aliyuncs.com/telpo_platform/iot_gateway_service | awk '{print $3}' | |||||
) | |||||
# 构建telpo/mrp:$image_version镜像 | |||||
docker build . -t telpo/iot_gateway_service:$image_version | |||||
#TODO:推送镜像到阿里仓库 | |||||
echo '=================开始推送镜像=======================' | |||||
docker login --username=rzl_wangjx@1111649216405698 --password=telpo.123 registry.cn-shanghai.aliyuncs.com | |||||
docker tag telpo/iot_gateway_service:$image_version registry.cn-shanghai.aliyuncs.com/telpo_platform/iot_gateway_service:$image_version | |||||
docker push registry.cn-shanghai.aliyuncs.com/telpo_platform/iot_gateway_service:$image_version | |||||
echo '=================推送镜像完成=======================' | |||||
#删除产生的None镜像 | |||||
docker rmi -f $(docker images | grep none | awk '{print $3}') | |||||
# 查看镜像列表 | |||||
docker images |
@@ -0,0 +1,26 @@ | |||||
#!/bin/bash | |||||
mvn clean | |||||
mvn package -Dmaven.test.skip=true | |||||
#image_version=$(date +%Y%m%d%H%M) | |||||
image_version=$version | |||||
docker stop iot_gateway_service || true | |||||
docker rm iot_gateway_service || true | |||||
# 删除镜像 | |||||
docker rmi -f $(docker images | grep telpo/iot_gateway_service | awk '{print $3}') | |||||
docker build . -t telpo/iot_gateway_service:$image_version | |||||
#TODO:推送镜像到私有仓库 | |||||
echo '=================开始推送镜像=======================' | |||||
docker tag telpo/iot_gateway_service:$image_version 139.224.254.18:5000/iot_gateway_service:$image_version | |||||
docker push 139.224.254.18:5000/iot_gateway_service:$image_version | |||||
echo '=================推送镜像完成=======================' | |||||
#删除产生的None镜像 | |||||
docker rmi -f $(docker images | grep none | awk '{print $3}') | |||||
# 查看镜像列表 | |||||
docker images | |||||
# 启动容器 | |||||
docker run -v /home/data/iotgatewayserver/log:/var/log/iotgatewayserver -d -e active=test --network host --restart=always --name iot_gateway_service telpo/iot_gateway_service:$image_version | |||||
# 查看日志 | |||||
docker logs iot_gateway_service |
@@ -0,0 +1,37 @@ | |||||
package com.telpo.iotgateway; | |||||
import com.telpo.iotgateway.server.IotSubscribe; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
import org.springframework.boot.context.properties.ConfigurationPropertiesScan; | |||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; | |||||
import org.springframework.context.ConfigurableApplicationContext; | |||||
import org.springframework.core.env.ConfigurableEnvironment; | |||||
import org.springframework.scheduling.annotation.EnableAsync; | |||||
import org.springframework.scheduling.annotation.EnableScheduling; | |||||
/** | |||||
* @program: DataPushServer | |||||
* @description: 推送服务启动程序 | |||||
* @author: linwl | |||||
* @create: 2020-07-10 18:04 | |||||
*/ | |||||
@SpringBootApplication | |||||
@EnableDiscoveryClient | |||||
@ConfigurationPropertiesScan | |||||
@EnableAsync | |||||
@EnableScheduling | |||||
@Slf4j | |||||
public class IotGatewayApplication { | |||||
public static void main(String[] args) { | |||||
ConfigurableApplicationContext applicationContext = SpringApplication.run(IotGatewayApplication.class, args); | |||||
ConfigurableEnvironment environment = applicationContext.getEnvironment(); | |||||
IotSubscribe iotSubscribe = new IotSubscribe(environment); | |||||
iotSubscribe.start(); | |||||
log.info("推送服务启动!"); | |||||
} | |||||
} |
@@ -0,0 +1,61 @@ | |||||
package com.telpo.iotgateway.config; | |||||
import com.fasterxml.jackson.databind.DeserializationFeature; | |||||
import com.fasterxml.jackson.databind.ObjectMapper; | |||||
import com.fasterxml.jackson.databind.SerializationFeature; | |||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; | |||||
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; | |||||
import models.Constants; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import java.time.LocalDate; | |||||
import java.time.LocalDateTime; | |||||
import java.time.LocalTime; | |||||
import java.time.format.DateTimeFormatter; | |||||
/** | |||||
* @program: DataPushServer | |||||
* @description: 序列化设置 | |||||
* @author: linwl | |||||
* @create: 2020-07-11 09:15 | |||||
*/ | |||||
@Configuration | |||||
public class JacksonConfig { | |||||
@Bean | |||||
public ObjectMapper objectMapper() { | |||||
ObjectMapper objectMapper = new ObjectMapper(); | |||||
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); | |||||
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); | |||||
JavaTimeModule javaTimeModule = new JavaTimeModule(); | |||||
javaTimeModule.addSerializer( | |||||
LocalDateTime.class, | |||||
new LocalDateTimeSerializer( | |||||
DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT))); | |||||
javaTimeModule.addSerializer( | |||||
LocalDate.class, | |||||
new LocalDateSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_FORMAT))); | |||||
javaTimeModule.addSerializer( | |||||
LocalTime.class, | |||||
new LocalTimeSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_TIME_FORMAT))); | |||||
javaTimeModule.addDeserializer( | |||||
LocalDateTime.class, | |||||
new LocalDateTimeDeserializer( | |||||
DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT))); | |||||
javaTimeModule.addDeserializer( | |||||
LocalDate.class, | |||||
new LocalDateDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_FORMAT))); | |||||
javaTimeModule.addDeserializer( | |||||
LocalTime.class, | |||||
new LocalTimeDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_TIME_FORMAT))); | |||||
objectMapper.registerModule(javaTimeModule).registerModule(new ParameterNamesModule()); | |||||
return objectMapper; | |||||
} | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package com.telpo.iotgateway.config; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import org.springframework.scheduling.annotation.SchedulingConfigurer; | |||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; | |||||
import org.springframework.scheduling.config.ScheduledTaskRegistrar; | |||||
/** | |||||
* @program: DataPushServer | |||||
* @description: 定时任务线程配置 | |||||
* @author: linwl | |||||
* @create: 2020-07-24 10:53 | |||||
*/ | |||||
@Configuration | |||||
public class SchedulingExecutorConfig implements SchedulingConfigurer { | |||||
@Value("${scheduler.pool.size}") | |||||
private int pollSize; | |||||
@Value("${scheduler.pool.await-seconds}") | |||||
private int awaitSeconds; | |||||
@Override | |||||
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { | |||||
ThreadPoolTaskScheduler taskScheduler = taskScheduler(); | |||||
taskRegistrar.setTaskScheduler(taskScheduler); | |||||
} | |||||
@Bean(destroyMethod = "shutdown", name = "taskScheduler") | |||||
public ThreadPoolTaskScheduler taskScheduler() { | |||||
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); | |||||
scheduler.setPoolSize(pollSize); | |||||
scheduler.setThreadNamePrefix("task-"); | |||||
scheduler.setAwaitTerminationSeconds(awaitSeconds); | |||||
scheduler.setWaitForTasksToCompleteOnShutdown(true); | |||||
return scheduler; | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
package com.telpo.iotgateway.dto; | |||||
import lombok.Getter; | |||||
import lombok.Setter; | |||||
import lombok.ToString; | |||||
/** | |||||
* @program: DataPushServer | |||||
* @description: | |||||
* @author: linwl | |||||
* @create: 2020-07-22 17:23 | |||||
*/ | |||||
@Setter | |||||
@Getter | |||||
@ToString | |||||
public class BaseDto { | |||||
/** 设备号 */ | |||||
private String imei; | |||||
/** 数据时间 */ | |||||
private String time; | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package com.telpo.iotgateway.exception; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.web.bind.annotation.ExceptionHandler; | |||||
import org.springframework.web.bind.annotation.ResponseBody; | |||||
import org.springframework.web.bind.annotation.RestControllerAdvice; | |||||
import response.ERRORCODE; | |||||
import response.Result; | |||||
import java.text.MessageFormat; | |||||
/** | |||||
* @program: DataPushServer | |||||
* @description: 全局异常拦截 | |||||
* @author: linwl | |||||
* @create: 2020-07-11 10:29 | |||||
*/ | |||||
@Slf4j | |||||
@RestControllerAdvice(basePackages = "com.telpo.datapushserver.controller") | |||||
public class GobalExceptionHandler { | |||||
@ExceptionHandler(value = Exception.class) | |||||
@ResponseBody | |||||
public Result<Boolean> exceptionErrorHandler(Exception e) throws Exception { | |||||
log.error(MessageFormat.format("推送服务发生异常:{0}!", e.getMessage()), e); | |||||
return new Result.Builder<Boolean>() | |||||
.setCode(ERRORCODE.SystemErr) | |||||
.setMessage(MessageFormat.format("系统发生异常:{0}!", e.getMessage())) | |||||
.build(); | |||||
} | |||||
} |
@@ -0,0 +1,66 @@ | |||||
package com.telpo.iotgateway.listener; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.qpid.jms.JmsConnectionListener; | |||||
import org.apache.qpid.jms.message.JmsInboundMessageDispatch; | |||||
import org.springframework.stereotype.Component; | |||||
import javax.jms.MessageConsumer; | |||||
import javax.jms.MessageProducer; | |||||
import javax.jms.Session; | |||||
import java.net.URI; | |||||
import java.time.LocalDateTime; | |||||
/** | |||||
* @program: iotgateway | |||||
* @description: IotJms连接侦听 | |||||
* @author: linwl | |||||
* @create: 2021-02-24 11:22 | |||||
**/ | |||||
@Slf4j | |||||
@Component | |||||
public class IotJmsConnectionListener implements JmsConnectionListener { | |||||
/** | |||||
* 连接成功建立。 | |||||
*/ | |||||
@Override | |||||
public void onConnectionEstablished(URI remoteURI) { | |||||
log.info("onConnectionEstablished, remoteUri:{0}, time:{1}", remoteURI, LocalDateTime.now()); | |||||
} | |||||
/** | |||||
* 尝试过最大重试次数之后,最终连接失败。 | |||||
*/ | |||||
@Override | |||||
public void onConnectionFailure(Throwable error) { | |||||
log.error("onConnectionFailure, {}", error.getMessage()); | |||||
} | |||||
/** | |||||
* 连接中断。 | |||||
*/ | |||||
@Override | |||||
public void onConnectionInterrupted(URI remoteURI) { | |||||
log.info("onConnectionInterrupted, remoteUri:{0}, time:{1}", remoteURI, LocalDateTime.now()); | |||||
} | |||||
/** | |||||
* 连接中断后又自动重连上。 | |||||
*/ | |||||
@Override | |||||
public void onConnectionRestored(URI remoteURI) { | |||||
log.info("onConnectionRestored, remoteUri:{0}, time:{1}", remoteURI, LocalDateTime.now()); | |||||
} | |||||
@Override | |||||
public void onInboundMessage(JmsInboundMessageDispatch envelope) {} | |||||
@Override | |||||
public void onSessionClosed(Session session, Throwable cause) {} | |||||
@Override | |||||
public void onConsumerClosed(MessageConsumer consumer, Throwable cause) {} | |||||
@Override | |||||
public void onProducerClosed(MessageProducer producer, Throwable cause) {} | |||||
} |
@@ -0,0 +1,75 @@ | |||||
package com.telpo.iotgateway.listener; | |||||
import com.google.common.base.Stopwatch; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.scheduling.annotation.Scheduled; | |||||
import org.springframework.stereotype.Component; | |||||
import javax.jms.Message; | |||||
import javax.jms.MessageListener; | |||||
import java.util.concurrent.ExecutorService; | |||||
/** | |||||
* @program: iotgateway | |||||
* @description: Iot消息侦听 | |||||
* @author: linwl | |||||
* @create: 2021-02-24 11:39 | |||||
**/ | |||||
@Slf4j | |||||
@Component | |||||
public class IotMessageListener implements MessageListener { | |||||
int count = 0; | |||||
private ExecutorService executorService; | |||||
public void setExecutorService(ExecutorService executorService) { | |||||
this.executorService = executorService; | |||||
} | |||||
@Override | |||||
public void onMessage(Message message) { | |||||
try { | |||||
//1.收到消息之后一定要ACK。 | |||||
// 推荐做法:创建Session选择Session.AUTO_ACKNOWLEDGE,这里会自动ACK。 | |||||
// 其他做法:创建Session选择Session.CLIENT_ACKNOWLEDGE,这里一定要调message.acknowledge()来ACK。 | |||||
// message.acknowledge(); | |||||
//2.建议异步处理收到的消息,确保onMessage函数里没有耗时逻辑。 | |||||
// 如果业务处理耗时过程过长阻塞住线程,可能会影响SDK收到消息后的正常回调。 | |||||
executorService.submit(() -> processMessage(message)); | |||||
count++; | |||||
} catch (Exception e) { | |||||
log.error("submit task occurs exception ", e); | |||||
} | |||||
} | |||||
/** | |||||
* 在这里处理您收到消息后的具体业务逻辑。 | |||||
*/ | |||||
private static void processMessage(Message message) { | |||||
try { | |||||
byte[] body = message.getBody(byte[].class); | |||||
String content = new String(body); | |||||
String topic = message.getStringProperty("topic"); | |||||
String messageId = message.getStringProperty("messageId"); | |||||
log.info("receive message" | |||||
+ ", topic = " + topic | |||||
+ ", messageId = " + messageId | |||||
+ ", content = " + content); | |||||
} catch (Exception e) { | |||||
log.error("processMessage occurs error ", e); | |||||
} | |||||
} | |||||
@Scheduled(cron = "${scheduler.task.cron}") | |||||
public void countMessages() { | |||||
//log.info("开始执行定时推送失败的推送记录!"); | |||||
// 获取推送失败的记录 | |||||
//try { | |||||
log.warn("约1分钟处理 {} 个请求",count); | |||||
count = 0; | |||||
//} catch (Exception e) { | |||||
// log.error("执行定时计数发生异常:", e); | |||||
//} | |||||
} | |||||
} |
@@ -0,0 +1,154 @@ | |||||
package com.telpo.iotgateway.server; | |||||
import com.telpo.iotgateway.listener.IotJmsConnectionListener; | |||||
import com.telpo.iotgateway.listener.IotMessageListener; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.qpid.jms.JmsConnection; | |||||
import org.apache.qpid.jms.JmsConnectionListener; | |||||
import org.springframework.core.env.ConfigurableEnvironment; | |||||
import org.springframework.stereotype.Component; | |||||
import org.apache.commons.codec.binary.Base64; | |||||
import java.util.concurrent.ExecutorService; | |||||
import java.util.concurrent.LinkedBlockingQueue; | |||||
import java.util.concurrent.ThreadPoolExecutor; | |||||
import java.util.concurrent.TimeUnit; | |||||
import javax.jms.*; | |||||
import javax.crypto.Mac; | |||||
import javax.crypto.spec.SecretKeySpec; | |||||
import javax.naming.Context; | |||||
import javax.naming.InitialContext; | |||||
import javax.naming.NamingException; | |||||
import java.util.Hashtable; | |||||
/** | |||||
* @program: DipperPositionServer | |||||
* @description: 北斗定位 | |||||
* @author: king | |||||
* @create: 2021-01-13 14:01 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
public class IotSubscribe { | |||||
//参数说明,请参见AMQP客户端接入说明文档。 | |||||
private String accessKey; | |||||
private String accessSecret; | |||||
private String consumerGroupId; | |||||
//iotInstanceId:企业版实例请填写实例ID,公共实例请填空字符串""。 | |||||
private String iotInstanceId; | |||||
private long timeStamp; | |||||
//签名方法:支持hmacmd5、hmacsha1和hmacsha256。 | |||||
private String signMethod; | |||||
private String clientId; | |||||
private String iotHost; | |||||
private String iotPort; | |||||
// 执行单元线程池 | |||||
private final static ExecutorService executorService = new ThreadPoolExecutor( | |||||
Runtime.getRuntime().availableProcessors(), | |||||
Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS, | |||||
new LinkedBlockingQueue<>(50000)); | |||||
// Jms连接侦听 | |||||
private static JmsConnectionListener myJmsConnectionListener = new IotJmsConnectionListener(); | |||||
// 消息侦听 | |||||
private static MessageListener messageListener = new IotMessageListener(); | |||||
public IotSubscribe(ConfigurableEnvironment environment) { | |||||
//参数说明,请参见AMQP客户端接入说明文档。 | |||||
this.accessKey = environment.getProperty("iot.accessKey"); | |||||
this.accessSecret = environment.getProperty("iot.accessSecret"); | |||||
this.consumerGroupId = environment.getProperty("iot.consumerGroupId"); | |||||
//iotInstanceId:企业版实例请填写实例ID,公共实例请填空字符串""。 | |||||
this.iotInstanceId = environment.getProperty("iot.iotInstanceId"); | |||||
//签名方法:支持hmacmd5、hmacsha1和hmacsha256。 | |||||
this.signMethod = environment.getProperty("iot.signMethod"); | |||||
this.clientId = environment.getProperty("iot.clientId"); | |||||
this.iotHost = environment.getProperty("iot.iotHost"); | |||||
this.iotPort = environment.getProperty("iot.iotPort"); | |||||
timeStamp = System.currentTimeMillis(); | |||||
} | |||||
/* | |||||
* 同步进程线程 | |||||
*/ | |||||
public void start() { | |||||
try { | |||||
//计算签名,password组装方法,请参见AMQP客户端接入说明文档。 | |||||
String userInfo = getUserInfo(); | |||||
String signContent = "authId=" + accessKey + "×tamp=" + timeStamp;; | |||||
String password = doSign(signContent,accessSecret, signMethod); | |||||
//接入域名,请参见AMQP客户端接入说明文档。 | |||||
// TODO Change ${YourHost} | |||||
String connectionUrl = "failover:(amqps://" + iotHost + ":" + iotPort | |||||
+ "?amqp.idleTimeout=80000)" | |||||
+ "?failover.reconnectDelay=30"; | |||||
Hashtable<String, String> hashtable = new Hashtable<>(); | |||||
hashtable.put("connectionfactory.SBCF",connectionUrl); | |||||
hashtable.put("queue.QUEUE", "default"); | |||||
hashtable.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory"); | |||||
Context context = new InitialContext(hashtable); | |||||
ConnectionFactory cf = (ConnectionFactory)context.lookup("SBCF"); | |||||
Destination queue = (Destination)context.lookup("QUEUE"); | |||||
// 创建连接。 | |||||
Connection connection = cf.createConnection(userInfo, password); | |||||
((JmsConnection) connection).addConnectionListener(myJmsConnectionListener); | |||||
// 创建会话。 | |||||
// Session.CLIENT_ACKNOWLEDGE: 收到消息后,需要手动调用message.acknowledge()。 | |||||
// Session.AUTO_ACKNOWLEDGE: SDK自动ACK(推荐)。 | |||||
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); | |||||
connection.start(); | |||||
// 创建Receiver连接。消费消息 | |||||
MessageConsumer consumer = session.createConsumer(queue); | |||||
// 设置消息侦听 | |||||
((IotMessageListener)messageListener).setExecutorService(this.executorService); | |||||
consumer.setMessageListener(messageListener); | |||||
} catch (IllegalArgumentException e) { | |||||
log.error("IllegalArgumentException:{}", e.getMessage()); | |||||
} catch (NamingException e) { | |||||
log.error("NamingException:{}", e.getMessage()); | |||||
} catch (JMSException e) { | |||||
log.error("JMSException:{}", e.getMessage()); | |||||
} catch (Exception e) { | |||||
log.error("Exception:{}", e.getMessage()); | |||||
} | |||||
} | |||||
/* | |||||
* userInfo组装 | |||||
*/ | |||||
private String getUserInfo() { | |||||
//userInfo组装 | |||||
String userInfo = clientId + "|authMode=aksign" | |||||
+ ",signMethod=" + signMethod | |||||
+ ",timestamp=" + timeStamp | |||||
+ ",authId=" + accessKey | |||||
+ ",iotInstanceId=" + iotInstanceId | |||||
+ ",consumerGroupId=" + consumerGroupId | |||||
+ "|"; | |||||
//计算签名,password组装方法,请参见AMQP客户端接入说明文档。 | |||||
return userInfo; | |||||
} | |||||
/** | |||||
* 计算签名,password组装方法,请参见AMQP客户端接入说明文档。 | |||||
*/ | |||||
private static String doSign(String toSignString, String secret, String signMethod) throws Exception { | |||||
SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), signMethod); | |||||
Mac mac = Mac.getInstance(signMethod); | |||||
mac.init(signingKey); | |||||
byte[] rawHmac = mac.doFinal(toSignString.getBytes()); | |||||
return Base64.encodeBase64String(rawHmac); | |||||
} | |||||
} |
@@ -0,0 +1,10 @@ | |||||
spring: | |||||
main: | |||||
allow-bean-definition-overriding: true | |||||
application: | |||||
name: push-service | |||||
cloud: | |||||
nacos: | |||||
config: | |||||
server-addr: 172.16.192.26:8848 | |||||
file-extension: yaml |
@@ -0,0 +1,10 @@ | |||||
spring: | |||||
main: | |||||
allow-bean-definition-overriding: true | |||||
application: | |||||
name: push-service | |||||
cloud: | |||||
nacos: | |||||
config: | |||||
server-addr: 172.19.42.38:8848 | |||||
file-extension: yaml |
@@ -0,0 +1,48 @@ | |||||
spring: | |||||
main: | |||||
allow-bean-definition-overriding: true | |||||
application: | |||||
name: push-service | |||||
cloud: | |||||
nacos: | |||||
config: | |||||
server-addr: 172.19.42.44:8848 | |||||
file-extension: yaml | |||||
jackson: | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
aop: | |||||
auto: true | |||||
proxy-target-class: true | |||||
devtools: | |||||
restart: | |||||
enabled: true | |||||
freemarker: | |||||
cache: false | |||||
async: | |||||
pool: | |||||
corePoolSize: 4 | |||||
maxPoolSize: 8 | |||||
queueCapacity: 5000 | |||||
scheduler: | |||||
pool: | |||||
size: 1 | |||||
#等待任务完成退出最大秒数 | |||||
await-seconds: 6 | |||||
task: | |||||
cron: "0 */1 * * * *" | |||||
iot: | |||||
accessKey: LTAI4FdXhwy1evoHXingMaiZ | |||||
accessSecret: CGmGpzta6ro8Bta4RLiQD18EF8m6Bm | |||||
consumerGroupId: eQVdFouKAYajil208F7F000100 | |||||
iotInstanceId: iot-cn-nif1vosz501 | |||||
RegionId: cn-shanghai | |||||
ProductKey: a18mXM6Cvx8 | |||||
//签名方法:支持hmacmd5、hmacsha1和hmacsha256。 | |||||
signMethod: hmacmd5 | |||||
clientId: gateway | |||||
iotHost: contoso.com | |||||
iotPort: 5671 |
@@ -0,0 +1,10 @@ | |||||
spring: | |||||
main: | |||||
allow-bean-definition-overriding: true | |||||
application: | |||||
name: push-service | |||||
cloud: | |||||
nacos: | |||||
config: | |||||
server-addr: 172.16.192.26:8848 | |||||
file-extension: yaml |
@@ -0,0 +1,197 @@ | |||||
<?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" />--> | |||||
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> | |||||
<property name="log.path" value="/var/log/iotgatewayserver"/> | |||||
<!-- 彩色日志 --> | |||||
<!-- 彩色日志依赖的渲染类 --> | |||||
<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>debug</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>7</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>7</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>7</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.telpo.iotgateway" 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> |