集成阿里云OSS,增加文件微服务

This commit is contained in:
xiongxiaoyang 2020-06-03 00:49:46 +08:00
parent 1bda806862
commit e790ae0b05
23 changed files with 551 additions and 42 deletions

View File

@ -26,6 +26,7 @@ novel-cloud
├── novel-gateway -- 基于Spring Cloud Gateway构建的网关服务
├── novel-monitor -- 基于Spring Boot Admin构建的监控中心
├── novel-search -- 基于Elastic Search构建的搜索微服务
├── novel-file -- 基于阿里云OSS构建的文件微服务
├── novel-home -- 门户首页微服务
├── novel-news -- 新闻中心微服务
├── novel-user -- 用户中心微服务

View File

@ -70,4 +70,23 @@ public interface BookApi {
* */
@GetMapping("api/book/listUserCommentByPage")
List<BookComment> listUserCommentByPage(@RequestParam("userId") Long userId,@RequestParam("page") int page, @RequestParam("pageSize") int pageSize);
/**
* 查询网络图片的小说
*
* @param localPicPrefix
* @param limit 查询条数
* @return 返回小说集合
* */
@GetMapping("api/book/queryNetworkPicBooks")
List<Book> queryNetworkPicBooks(@RequestParam("localPicPrefix") String localPicPrefix,@RequestParam("limit") int limit);
/**
* 更新图片路径
* @param picUrl 图片路径
* @param bookId 小说ID
*/
@PostMapping("api/book/updateBookPic")
void updateBookPic(@RequestParam("picUrl") String picUrl,@RequestParam("bookId") Long bookId);
}

View File

@ -91,4 +91,27 @@ public class BookApi {
List<BookComment> listUserCommentByPage(@RequestParam("userId") Long userId,@RequestParam("page") int page, @RequestParam("pageSize") int pageSize){
return bookService.listUserCommentByPage(userId,page,pageSize);
}
/**
* 查询网络图片的小说
*
* @param localPicPrefix
* @param limit 查询条数
* @return 返回小说集合
* */
@GetMapping("queryNetworkPicBooks")
List<Book> queryNetworkPicBooks(@RequestParam("localPicPrefix") String localPicPrefix,@RequestParam("limit") int limit){
return bookService.queryNetworkPicBooks(localPicPrefix,limit);
}
/**
* 更新图片路径
* @param picUrl 图片路径
* @param bookId 小说ID
*/
@PostMapping("updateBookPic")
void updateBookPic(@RequestParam("picUrl") String picUrl,@RequestParam("bookId") Long bookId){
bookService.updateBookPic(picUrl,bookId);
}
}

View File

@ -15,7 +15,10 @@ import org.springframework.stereotype.Component;
/**
* @author 11797
* 消息监听器
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Component
@Slf4j

View File

@ -136,4 +136,21 @@ public interface BookService {
* @return 评论数据
* */
List<BookComment> listUserCommentByPage(Long userId, int page, int pageSize);
/**
* 查询网络图片的小说
*
* @param localPicPrefix
* @param limit 查询条数
* @return 返回小说集合
* */
List<Book> queryNetworkPicBooks(String localPicPrefix, Integer limit);
/**
* 更新图片路径
* @param picUrl 图片路径
* @param bookId 小说ID
*/
void updateBookPic(String picUrl, Long bookId);
}

View File

@ -30,6 +30,7 @@ import static org.mybatis.dynamic.sql.select.SelectDSL.select;
/**
* 小说服务接口实现
*
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
@ -63,14 +64,14 @@ public class BookServiceImpl implements BookService {
@Override
public List<Book> queryBookByIds(List<Long> ids) {
return bookMapper.selectMany(select(BookDynamicSqlSupport.id,BookDynamicSqlSupport.catId,BookDynamicSqlSupport.catName,
BookDynamicSqlSupport.bookName,BookDynamicSqlSupport.authorName,
BookDynamicSqlSupport.lastIndexId,BookDynamicSqlSupport.lastIndexName,BookDynamicSqlSupport.lastIndexUpdateTime,
BookDynamicSqlSupport.picUrl,BookDynamicSqlSupport.bookDesc,BookDynamicSqlSupport.score)
return bookMapper.selectMany(select(BookDynamicSqlSupport.id, BookDynamicSqlSupport.catId, BookDynamicSqlSupport.catName,
BookDynamicSqlSupport.bookName, BookDynamicSqlSupport.authorName,
BookDynamicSqlSupport.lastIndexId, BookDynamicSqlSupport.lastIndexName, BookDynamicSqlSupport.lastIndexUpdateTime,
BookDynamicSqlSupport.picUrl, BookDynamicSqlSupport.bookDesc, BookDynamicSqlSupport.score)
.from(book)
.where(BookDynamicSqlSupport.id,isIn(ids))
.build()
.render(RenderingStrategies.MYBATIS3)
.where(BookDynamicSqlSupport.id, isIn(ids))
.build()
.render(RenderingStrategies.MYBATIS3)
);
}
@ -104,12 +105,12 @@ public class BookServiceImpl implements BookService {
BookDynamicSqlSupport.authorId, BookDynamicSqlSupport.authorName,
BookDynamicSqlSupport.picUrl, BookDynamicSqlSupport.bookDesc,
BookDynamicSqlSupport.wordCount, BookDynamicSqlSupport.lastIndexUpdateTime)
.from(book)
.where(BookDynamicSqlSupport.wordCount, isGreaterThan(0))
.orderBy(sortSpecification)
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3);
.from(book)
.where(BookDynamicSqlSupport.wordCount, isGreaterThan(0))
.orderBy(sortSpecification)
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3);
return bookMapper.selectMany(selectStatement);
}
@ -132,12 +133,12 @@ public class BookServiceImpl implements BookService {
.build()
.render(RenderingStrategies.MYBATIS3);
List<Book> books = bookMapper.selectMany(selectStatement);
return books.size() >0 ? books.get(0) : null;
return books.size() > 0 ? books.get(0) : null;
}
@Override
public void addVisitCount(Long bookId, int addCount) {
bookMapper.addVisitCount(bookId,addCount);
bookMapper.addVisitCount(bookId, addCount);
}
@ -173,12 +174,12 @@ public class BookServiceImpl implements BookService {
//分页查询小说评论数据
PageHelper.startPage(page, pageSize);
List<BookComment> bookCommentList = bookCommentMapper.selectMany(
select(BookCommentDynamicSqlSupport.id,BookCommentDynamicSqlSupport.bookId,
select(BookCommentDynamicSqlSupport.id, BookCommentDynamicSqlSupport.bookId,
BookCommentDynamicSqlSupport.createUserId,
BookCommentDynamicSqlSupport.commentContent,BookCommentDynamicSqlSupport.replyCount,
BookCommentDynamicSqlSupport.commentContent, BookCommentDynamicSqlSupport.replyCount,
BookCommentDynamicSqlSupport.createTime)
.from(BookCommentDynamicSqlSupport.bookComment)
.where(BookCommentDynamicSqlSupport.bookId,isEqualTo(bookId))
.where(BookCommentDynamicSqlSupport.bookId, isEqualTo(bookId))
.orderBy(BookCommentDynamicSqlSupport.createTime.descending())
.build()
.render(RenderingStrategies.MYBATIS3));
@ -190,11 +191,11 @@ public class BookServiceImpl implements BookService {
//将评论数据和评论人数据关联起来
List<BookCommentVO> resultList = new ArrayList<>(bookCommentList.size());
for(BookComment bookComment : bookCommentList){
for (BookComment bookComment : bookCommentList) {
BookCommentVO bookCommentVO = new BookCommentVO();
BeanUtils.copyProperties(bookComment,bookCommentVO);
BeanUtils.copyProperties(bookComment, bookCommentVO);
User user = userMap.get(bookComment.getCreateUserId());
if(user != null){
if (user != null) {
bookCommentVO.setCreateUserName(user.getUsername());
bookCommentVO.setCreateUserPhoto(user.getUserPhoto());
}
@ -260,9 +261,9 @@ public class BookServiceImpl implements BookService {
.render(RenderingStrategies.MYBATIS3);
List<BookIndex> list = bookIndexMapper.selectMany(selectStatement);
if (list.size() == 0) {
result.put("preBookIndexId",0L);
result.put("preBookIndexId", 0L);
} else {
result.put("preBookIndexId",list.get(0).getId());
result.put("preBookIndexId", list.get(0).getId());
}
selectStatement = select(BookIndexDynamicSqlSupport.id)
@ -275,9 +276,9 @@ public class BookServiceImpl implements BookService {
.render(RenderingStrategies.MYBATIS3);
list = bookIndexMapper.selectMany(selectStatement);
if (list.size() == 0) {
result.put("nextBookIndexId",0L);
result.put("nextBookIndexId", 0L);
} else {
result.put("nextBookIndexId",list.get(0).getId());
result.put("nextBookIndexId", list.get(0).getId());
}
@ -310,14 +311,44 @@ public class BookServiceImpl implements BookService {
public List<BookComment> listUserCommentByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize);
return bookCommentMapper.selectMany(
select(BookCommentDynamicSqlSupport.id,BookCommentDynamicSqlSupport.bookId,
select(BookCommentDynamicSqlSupport.id, BookCommentDynamicSqlSupport.bookId,
BookCommentDynamicSqlSupport.createUserId,
BookCommentDynamicSqlSupport.commentContent,BookCommentDynamicSqlSupport.replyCount,
BookCommentDynamicSqlSupport.commentContent, BookCommentDynamicSqlSupport.replyCount,
BookCommentDynamicSqlSupport.createTime)
.from(BookCommentDynamicSqlSupport.bookComment)
.where(BookCommentDynamicSqlSupport.createUserId,isEqualTo(userId))
.where(BookCommentDynamicSqlSupport.createUserId, isEqualTo(userId))
.orderBy(BookCommentDynamicSqlSupport.createTime.descending())
.build()
.render(RenderingStrategies.MYBATIS3));
}
@Override
public List<Book> queryNetworkPicBooks(String localPicPrefix, Integer limit) {
return bookMapper.selectMany(
select(BookDynamicSqlSupport.id, BookDynamicSqlSupport.picUrl)
.from(book)
.where(BookDynamicSqlSupport.picUrl, isLike("http%"))
.and(BookDynamicSqlSupport.picUrl, isNotLike(localPicPrefix))
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3));
}
@Override
public void updateBookPic(String picUrl, Long bookId) {
bookMapper.update(update(book)
.set(BookDynamicSqlSupport.picUrl)
.equalTo(picUrl)
.set(BookDynamicSqlSupport.updateTime)
.equalTo(new Date())
.where(BookDynamicSqlSupport.id, isEqualTo(bookId))
.build()
.render(RenderingStrategies.MYBATIS3));
}
}

View File

@ -9,7 +9,10 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author 11797
* rabbitmq配置类
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Configuration
@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "host", matchIfMissing = false)

View File

@ -9,6 +9,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import javax.imageio.ImageIO;
import java.io.*;
import java.util.Date;
import java.util.Objects;
@ -23,23 +24,20 @@ import java.util.Objects;
public class FileUtil {
/**
* 网络图片转本地
* 网络图片转临时文件
* */
public static String network2Local(String picSrc,String picSavePath,String visitPrefix) {
public static File networkPic2Temp(String picSrc) {
File picFile = null;
InputStream input = null;
OutputStream out = null;
try {
//本地图片保存
HttpHeaders headers = new HttpHeaders();
HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<Resource> resEntity = RestTemplateUtil.getInstance(Charsets.ISO_8859_1.name()).exchange(picSrc, HttpMethod.GET, requestEntity, Resource.class);
input = Objects.requireNonNull(resEntity.getBody()).getInputStream();
Date currentDate = new Date();
picSrc = visitPrefix + DateUtils.formatDate(currentDate, "yyyy") + "/" + DateUtils.formatDate(currentDate, "MM") + "/" + DateUtils.formatDate(currentDate, "dd") + "/"
+ UUIDUtil.getUUID32()
+ picSrc.substring(picSrc.lastIndexOf("."));
File picFile = new File(picSavePath + picSrc);
picFile = File.createTempFile("temp",picSrc.substring(picSrc.lastIndexOf(".")));
File parentFile = picFile.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
@ -49,10 +47,15 @@ public class FileUtil {
out.write(b, 0, n);
}
out.flush();
if( ImageIO.read(picFile) == null){
return null;
}
}catch (Exception e){
log.error(e.getMessage(),e);
picSrc = "/images/default.gif";
return null;
}finally {
if(input != null){
try {
@ -69,11 +72,15 @@ public class FileUtil {
}
}
}
if(picFile != null) {
//程序退出时删除临时文件
picFile.deleteOnExit();
}
}
return picSrc;
return picFile;
}

82
novel-file/pom.xml Normal file
View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-cloud</artifactId>
<groupId>com.java2nb.novel</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>novel-file</artifactId>
<dependencies>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>book-api</artifactId>
<exclusions>
<exclusion>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis.dynamic-sql</groupId>
<artifactId>mybatis-dynamic-sql</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix</artifactId>
</dependency>
<!--aliyunOSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun-sdk-oss.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,22 @@
package com.java2nb.novel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 文件微服务启动器
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@SpringBootApplication
@EnableFeignClients
@EnableScheduling
public class FileApplication {
public static void main(String[] args) {
SpringApplication.run(FileApplication.class);
}
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* OSS配置
*
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Data
@Component
@ConfigurationProperties(prefix="novel.file")
public class OssProperties {
private String endpoint;
private String keyId;
private String keySecret;
private String fileHost;
private String bucketName;
private String webUrl;
}

View File

@ -0,0 +1,17 @@
package com.java2nb.novel.feign;
import com.java2nb.novel.book.api.BookApi;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 小说服务Feign客户端
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@FeignClient(value = "book-service")
public interface BookFeignClient extends BookApi {
}

View File

@ -0,0 +1,77 @@
package com.java2nb.novel.schedule;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.common.utils.Constants;
import com.java2nb.novel.common.utils.FileUtil;
import com.java2nb.novel.feign.BookFeignClient;
import com.java2nb.novel.service.FileService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.List;
/**
* 将爬取的网络图片转存到OSS任务
*
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class CrawlPicTransSchedule {
private final BookFeignClient bookFeignClient;
private final RedissonClient redissonClient;
private final FileService fileService;
/**
* 10分钟转一次
*/
@Scheduled(fixedRate = 1000 * 60 * 10)
@SneakyThrows
public void trans() {
RLock lock = redissonClient.getLock("crawlPicTrans");
lock.lock();
try {
List<Book> networkPicBooks = bookFeignClient.queryNetworkPicBooks(Constants.LOCAL_PIC_PREFIX, 100);
for (Book book : networkPicBooks) {
String filePath = "/images/default.gif";
File file = FileUtil.networkPic2Temp(book.getPicUrl());
if (file != null) {
filePath = fileService.uploadFile(file);
}
bookFeignClient.updateBookPic(filePath, book.getId());
//3秒钟转化一张图片10分钟转化200张
Thread.sleep(3000);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
lock.unlock();
}
}

View File

@ -0,0 +1,21 @@
package com.java2nb.novel.service;
import java.io.File;
/**
* 文件服务接口
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
public interface FileService {
/**
* 上传文件
* @param file 上传文件
* @return 上传地址
* */
String uploadFile(File file);
}

View File

@ -0,0 +1,70 @@
package com.java2nb.novel.service.impl;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.java2nb.novel.common.utils.Constants;
import com.java2nb.novel.common.utils.FileUtil;
import com.java2nb.novel.common.utils.UUIDUtil;
import com.java2nb.novel.config.OssProperties;
import com.java2nb.novel.service.FileService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import java.io.File;
/**
* 文件服务接口实现类
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class FileServiceImpl implements FileService {
private final OssProperties ossProperties;
@Override
public String uploadFile(File file) {
String fileName = file.getName();
String filePath =
Constants.LOCAL_PIC_PREFIX + UUIDUtil.getUUID32() + fileName.substring(fileName.lastIndexOf("."));
filePath = filePath.replaceFirst("/","");
OSSClient ossClient = new OSSClient(ossProperties.getEndpoint(), ossProperties.getKeyId(), ossProperties.getKeySecret());
try {
//容器不存在就创建
if (!ossClient.doesBucketExist(ossProperties.getBucketName())) {
ossClient.createBucket(ossProperties.getBucketName());
CreateBucketRequest createBucketRequest = new CreateBucketRequest(ossProperties.getBucketName());
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
//上传文件
PutObjectResult result = ossClient.putObject(new PutObjectRequest(ossProperties.getBucketName(), filePath, file));
//设置权限 这里是公开读
ossClient.setBucketAcl(ossProperties.getBucketName(), CannedAccessControlList.PublicRead);
if(result != null) {
return ossProperties.getWebUrl() + "/" + filePath;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
//关闭
ossClient.shutdown();
}
return "/images/default.gif";
}
}

View File

@ -0,0 +1,4 @@
spring:
profiles:
include: [common]

View File

@ -0,0 +1,13 @@
spring:
application:
name: novel-file
profiles:
active: dev
cloud:
nacos:
config:
extconfig[0]:
dataid: novel-redis.yml
group: novel-common
refresh: true

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 彩色日志依赖的渲染类 -->
<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}}" />
<!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
<!-- appender是configuration的子节点是负责写日志的组件。 -->
<!-- ConsoleAppender把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--
<pattern>%d %p (%file:%line\)- %m%n</pattern>
-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 控制台也要使用UTF-8不要使用GBK否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- RollingFileAppender滚动记录文件先将日志记录到指定文件当符合某个条件时将日志记录到其他文件 -->
<!-- 以下的大概意思是1.先按日期存日志日期变了将前一天的日志文件名重命名为XXX%日期%索引新的日志仍然是demo.log -->
<!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/novel-file.log</File>
<!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
<!-- TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 活动文件的名字会根据fileNamePattern的值每隔一段时间改变一次 -->
<!-- 文件名logs/demo.2017-12-05.0.log -->
<fileNamePattern>logs/debug.%d.%i.log</fileNamePattern>
<!-- 每产生一个日志文件该日志文件的保存期限为30天 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小默认值是10MB测试时可改成1KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- pattern节点用来设置日志的输入格式 -->
<pattern>
%d %p (%file:%line\)- %m%n
</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 控制台输出日志级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="com.java2nb" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
</configuration>

View File

@ -16,7 +16,10 @@ import org.springframework.stereotype.Component;
/**
* @author 11797
* 消息监听器
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Component
@Slf4j

View File

@ -1,7 +1,6 @@
package com.java2nb.novel.search.service;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.common.bean.PageBean;
import com.java2nb.novel.search.vo.EsBookVO;

View File

@ -19,6 +19,7 @@
<module>novel-pay</module>
<module>novel-search</module>
<module>novel-author</module>
<module>novel-file</module>
</modules>
<packaging>pom</packaging>

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB