mirror of
https://github.com/201206030/novel.git
synced 2025-04-27 07:30:50 +00:00
feat: 集成 Spring AMQP,使用 RabbitMQ 发送小说更新消息
默认关闭,通过 spring.rabbitmq.enable 配置属性来开启
This commit is contained in:
parent
a8e2e2d5c9
commit
e5592b85dd
6
pom.xml
6
pom.xml
@ -110,6 +110,12 @@
|
|||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- MQ 相关-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-amqp</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>mysql</groupId>
|
<groupId>mysql</groupId>
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
@ -5,7 +5,7 @@ import io.github.xxyopen.novel.core.common.exception.BusinessException;
|
|||||||
import io.github.xxyopen.novel.core.constant.SystemConfigConsts;
|
import io.github.xxyopen.novel.core.constant.SystemConfigConsts;
|
||||||
import io.github.xxyopen.novel.core.util.JwtUtils;
|
import io.github.xxyopen.novel.core.util.JwtUtils;
|
||||||
import io.github.xxyopen.novel.dto.UserInfoDto;
|
import io.github.xxyopen.novel.dto.UserInfoDto;
|
||||||
import io.github.xxyopen.novel.manager.UserInfoCacheManager;
|
import io.github.xxyopen.novel.manager.cache.UserInfoCacheManager;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -5,8 +5,8 @@ import io.github.xxyopen.novel.core.common.exception.BusinessException;
|
|||||||
import io.github.xxyopen.novel.core.constant.ApiRouterConsts;
|
import io.github.xxyopen.novel.core.constant.ApiRouterConsts;
|
||||||
import io.github.xxyopen.novel.core.util.JwtUtils;
|
import io.github.xxyopen.novel.core.util.JwtUtils;
|
||||||
import io.github.xxyopen.novel.dto.AuthorInfoDto;
|
import io.github.xxyopen.novel.dto.AuthorInfoDto;
|
||||||
import io.github.xxyopen.novel.manager.AuthorInfoCacheManager;
|
import io.github.xxyopen.novel.manager.cache.AuthorInfoCacheManager;
|
||||||
import io.github.xxyopen.novel.manager.UserInfoCacheManager;
|
import io.github.xxyopen.novel.manager.cache.UserInfoCacheManager;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ package io.github.xxyopen.novel.core.auth;
|
|||||||
|
|
||||||
import io.github.xxyopen.novel.core.common.exception.BusinessException;
|
import io.github.xxyopen.novel.core.common.exception.BusinessException;
|
||||||
import io.github.xxyopen.novel.core.util.JwtUtils;
|
import io.github.xxyopen.novel.core.util.JwtUtils;
|
||||||
import io.github.xxyopen.novel.manager.UserInfoCacheManager;
|
import io.github.xxyopen.novel.manager.cache.UserInfoCacheManager;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@ -13,11 +13,14 @@ public class CommonConsts {
|
|||||||
* 是
|
* 是
|
||||||
* */
|
* */
|
||||||
public static final Integer YES = 1;
|
public static final Integer YES = 1;
|
||||||
|
public static final String TRUE = "true";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 否
|
* 否
|
||||||
* */
|
* */
|
||||||
public static final Integer NO = 0;
|
public static final Integer NO = 0;
|
||||||
|
public static final String FALSE = "false";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 性别常量
|
* 性别常量
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
package io.github.xxyopen.novel.core.config;
|
||||||
|
|
||||||
|
import io.github.xxyopen.novel.core.constant.AmqpConsts;
|
||||||
|
import org.springframework.amqp.core.Binding;
|
||||||
|
import org.springframework.amqp.core.BindingBuilder;
|
||||||
|
import org.springframework.amqp.core.FanoutExchange;
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMQP 配置类
|
||||||
|
*
|
||||||
|
* @author xiongxiaoyang
|
||||||
|
* @date 2022/5/25
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class AmqpConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说信息改变交换机
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public FanoutExchange bookChangeExchange() {
|
||||||
|
return new FanoutExchange(AmqpConsts.BookChangeMq.EXCHANGE_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Elasticsearch book 索引更新队列
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public Queue esBookUpdateQueue() {
|
||||||
|
return new Queue(AmqpConsts.BookChangeMq.QUEUE_ES_UPDATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Elasticsearch book 索引更新队列绑定到小说信息改变交换机
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public Binding esBookUpdateQueueBinding() {
|
||||||
|
return BindingBuilder.bind(esBookUpdateQueue()).to(bookChangeExchange());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package io.github.xxyopen.novel.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMQP 相关常量
|
||||||
|
*
|
||||||
|
* @author xiongxiaoyang
|
||||||
|
* @date 2022/5/25
|
||||||
|
*/
|
||||||
|
public class AmqpConsts {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说信息改变 MQ
|
||||||
|
* */
|
||||||
|
public static class BookChangeMq{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说信息改变交换机
|
||||||
|
* */
|
||||||
|
public static final String EXCHANGE_NAME = "EXCHANGE-BOOK-CHANGE";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Elasticsearch book 索引更新的队列
|
||||||
|
* */
|
||||||
|
public static final String QUEUE_ES_UPDATE = "QUEUE-ES-BOOK-UPDATE";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Redis book 缓存更新的队列
|
||||||
|
* */
|
||||||
|
public static final String QUEUE_REDIS_UPDATE = "QUEUE-REDIS-BOOK-UPDATE";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package io.github.xxyopen.novel.core.listener;
|
||||||
|
|
||||||
|
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
||||||
|
import co.elastic.clients.elasticsearch.core.IndexResponse;
|
||||||
|
import io.github.xxyopen.novel.core.constant.AmqpConsts;
|
||||||
|
import io.github.xxyopen.novel.core.constant.EsConsts;
|
||||||
|
import io.github.xxyopen.novel.dao.entity.BookInfo;
|
||||||
|
import io.github.xxyopen.novel.dao.mapper.BookInfoMapper;
|
||||||
|
import io.github.xxyopen.novel.dto.es.EsBookDto;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rabbit 队列监听器
|
||||||
|
*
|
||||||
|
* @author xiongxiaoyang
|
||||||
|
* @date 2022/5/25
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@ConditionalOnProperty(prefix = "spring.elasticsearch", name = "enable", havingValue = "true")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class RabbitQueueListener {
|
||||||
|
|
||||||
|
private final BookInfoMapper bookInfoMapper;
|
||||||
|
|
||||||
|
private final ElasticsearchClient esClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听小说信息改变的 ES 更新队列,更新最新小说信息到 ES
|
||||||
|
* */
|
||||||
|
@RabbitListener(queues = AmqpConsts.BookChangeMq.QUEUE_ES_UPDATE)
|
||||||
|
@SneakyThrows
|
||||||
|
public void updateEsBook(Long bookId) {
|
||||||
|
BookInfo bookInfo = bookInfoMapper.selectById(bookId);
|
||||||
|
IndexResponse response = esClient.index(i -> i
|
||||||
|
.index(EsConsts.BookIndex.INDEX_NAME)
|
||||||
|
.id(bookInfo.getId().toString())
|
||||||
|
.document(EsBookDto.build(bookInfo))
|
||||||
|
);
|
||||||
|
log.info("Indexed with version " + response.version());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,7 +18,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.time.ZoneOffset;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,12 +59,11 @@ public class BookToEsTask {
|
|||||||
BulkRequest.Builder br = new BulkRequest.Builder();
|
BulkRequest.Builder br = new BulkRequest.Builder();
|
||||||
|
|
||||||
for (BookInfo book : bookInfos) {
|
for (BookInfo book : bookInfos) {
|
||||||
EsBookDto esBook = buildEsBook(book);
|
|
||||||
br.operations(op -> op
|
br.operations(op -> op
|
||||||
.index(idx -> idx
|
.index(idx -> idx
|
||||||
.index(EsConsts.BookIndex.INDEX_NAME)
|
.index(EsConsts.BookIndex.INDEX_NAME)
|
||||||
.id(book.getId().toString())
|
.id(book.getId().toString())
|
||||||
.document(esBook)
|
.document(EsBookDto.build(book))
|
||||||
)
|
)
|
||||||
).timeout(Time.of(t -> t.time("10s")));
|
).timeout(Time.of(t -> t.time("10s")));
|
||||||
maxId = book.getId();
|
maxId = book.getId();
|
||||||
@ -87,26 +85,4 @@ public class BookToEsTask {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private EsBookDto buildEsBook(BookInfo book) {
|
|
||||||
return EsBookDto.builder()
|
|
||||||
.id(book.getId())
|
|
||||||
.categoryId(book.getCategoryId())
|
|
||||||
.categoryName(book.getCategoryName())
|
|
||||||
.bookDesc(book.getBookDesc())
|
|
||||||
.bookName(book.getBookName())
|
|
||||||
.authorId(book.getAuthorId())
|
|
||||||
.authorName(book.getAuthorName())
|
|
||||||
.bookStatus(book.getBookStatus())
|
|
||||||
.commentCount(book.getCommentCount())
|
|
||||||
.isVip(book.getIsVip())
|
|
||||||
.score(book.getScore())
|
|
||||||
.visitCount(book.getVisitCount())
|
|
||||||
.wordCount(book.getWordCount())
|
|
||||||
.workDirection(book.getWorkDirection())
|
|
||||||
.lastChapterId(book.getLastChapterId())
|
|
||||||
.lastChapterName(book.getLastChapterName())
|
|
||||||
.lastChapterUpdateTime(book.getLastChapterUpdateTime()
|
|
||||||
.toInstant(ZoneOffset.ofHours(8)).toEpochMilli())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
package io.github.xxyopen.novel.dto.es;
|
package io.github.xxyopen.novel.dto.es;
|
||||||
|
|
||||||
|
import io.github.xxyopen.novel.dao.entity.BookInfo;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.time.ZoneOffset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Elasticsearch 存储小说 DTO
|
* Elasticsearch 存储小说 DTO
|
||||||
* @author xiongxiaoyang
|
* @author xiongxiaoyang
|
||||||
@ -101,4 +104,27 @@ public class EsBookDto {
|
|||||||
*/
|
*/
|
||||||
private Integer isVip;
|
private Integer isVip;
|
||||||
|
|
||||||
|
public static EsBookDto build(BookInfo bookInfo){
|
||||||
|
return EsBookDto.builder()
|
||||||
|
.id(bookInfo.getId())
|
||||||
|
.categoryId(bookInfo.getCategoryId())
|
||||||
|
.categoryName(bookInfo.getCategoryName())
|
||||||
|
.bookDesc(bookInfo.getBookDesc())
|
||||||
|
.bookName(bookInfo.getBookName())
|
||||||
|
.authorId(bookInfo.getAuthorId())
|
||||||
|
.authorName(bookInfo.getAuthorName())
|
||||||
|
.bookStatus(bookInfo.getBookStatus())
|
||||||
|
.commentCount(bookInfo.getCommentCount())
|
||||||
|
.isVip(bookInfo.getIsVip())
|
||||||
|
.score(bookInfo.getScore())
|
||||||
|
.visitCount(bookInfo.getVisitCount())
|
||||||
|
.wordCount(bookInfo.getWordCount())
|
||||||
|
.workDirection(bookInfo.getWorkDirection())
|
||||||
|
.lastChapterId(bookInfo.getLastChapterId())
|
||||||
|
.lastChapterName(bookInfo.getLastChapterName())
|
||||||
|
.lastChapterUpdateTime(bookInfo.getLastChapterUpdateTime()
|
||||||
|
.toInstant(ZoneOffset.ofHours(8)).toEpochMilli())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
||||||
import io.github.xxyopen.novel.dao.entity.BookChapter;
|
import io.github.xxyopen.novel.dao.entity.BookChapter;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.cache;
|
||||||
|
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
||||||
import io.github.xxyopen.novel.dao.entity.UserInfo;
|
import io.github.xxyopen.novel.dao.entity.UserInfo;
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.dao;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.github.xxyopen.novel.core.constant.DatabaseConsts;
|
import io.github.xxyopen.novel.core.constant.DatabaseConsts;
|
@ -0,0 +1,52 @@
|
|||||||
|
package io.github.xxyopen.novel.manager.mq;
|
||||||
|
|
||||||
|
import io.github.xxyopen.novel.core.common.constant.CommonConsts;
|
||||||
|
import io.github.xxyopen.novel.core.constant.AmqpConsts;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.amqp.core.AmqpTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.transaction.support.TransactionSynchronization;
|
||||||
|
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMQP 消息管理类
|
||||||
|
*
|
||||||
|
* @author xiongxiaoyang
|
||||||
|
* @date 2022/5/25
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class AmqpMsgManager {
|
||||||
|
|
||||||
|
private final AmqpTemplate amqpTemplate;
|
||||||
|
|
||||||
|
@Value("${spring.amqp.enable}")
|
||||||
|
private String enableAmqp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送小说信息改变消息
|
||||||
|
*/
|
||||||
|
public void sendBookChangeMsg(Long bookId) {
|
||||||
|
if (Objects.equals(enableAmqp, CommonConsts.TRUE)) {
|
||||||
|
sendAmqpMessage(amqpTemplate, AmqpConsts.BookChangeMq.EXCHANGE_NAME, null, bookId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendAmqpMessage(AmqpTemplate amqpTemplate, String exchange, String routingKey, Object message) {
|
||||||
|
// 如果在事务中则在事务执行完成后再发送,否则可以直接发送
|
||||||
|
if (TransactionSynchronizationManager.isActualTransactionActive()) {
|
||||||
|
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||||
|
@Override
|
||||||
|
public void afterCommit() {
|
||||||
|
amqpTemplate.convertAndSend(exchange, routingKey, message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
amqpTemplate.convertAndSend(exchange, routingKey, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package io.github.xxyopen.novel.manager;
|
package io.github.xxyopen.novel.manager.redis;
|
||||||
|
|
||||||
import io.github.xxyopen.novel.core.common.util.ImgVerifyCodeUtils;
|
import io.github.xxyopen.novel.core.common.util.ImgVerifyCodeUtils;
|
||||||
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
import io.github.xxyopen.novel.core.constant.CacheConsts;
|
@ -5,7 +5,7 @@ import io.github.xxyopen.novel.dao.entity.AuthorInfo;
|
|||||||
import io.github.xxyopen.novel.dao.mapper.AuthorInfoMapper;
|
import io.github.xxyopen.novel.dao.mapper.AuthorInfoMapper;
|
||||||
import io.github.xxyopen.novel.dto.AuthorInfoDto;
|
import io.github.xxyopen.novel.dto.AuthorInfoDto;
|
||||||
import io.github.xxyopen.novel.dto.req.AuthorRegisterReqDto;
|
import io.github.xxyopen.novel.dto.req.AuthorRegisterReqDto;
|
||||||
import io.github.xxyopen.novel.manager.AuthorInfoCacheManager;
|
import io.github.xxyopen.novel.manager.cache.AuthorInfoCacheManager;
|
||||||
import io.github.xxyopen.novel.service.AuthorService;
|
import io.github.xxyopen.novel.service.AuthorService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -15,7 +15,9 @@ import io.github.xxyopen.novel.dto.req.BookAddReqDto;
|
|||||||
import io.github.xxyopen.novel.dto.req.ChapterAddReqDto;
|
import io.github.xxyopen.novel.dto.req.ChapterAddReqDto;
|
||||||
import io.github.xxyopen.novel.dto.req.UserCommentReqDto;
|
import io.github.xxyopen.novel.dto.req.UserCommentReqDto;
|
||||||
import io.github.xxyopen.novel.dto.resp.*;
|
import io.github.xxyopen.novel.dto.resp.*;
|
||||||
import io.github.xxyopen.novel.manager.*;
|
import io.github.xxyopen.novel.manager.cache.*;
|
||||||
|
import io.github.xxyopen.novel.manager.dao.UserDaoManager;
|
||||||
|
import io.github.xxyopen.novel.manager.mq.AmqpMsgManager;
|
||||||
import io.github.xxyopen.novel.service.BookService;
|
import io.github.xxyopen.novel.service.BookService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -62,6 +64,8 @@ public class BookServiceImpl implements BookService {
|
|||||||
|
|
||||||
private final UserDaoManager userDaoManager;
|
private final UserDaoManager userDaoManager;
|
||||||
|
|
||||||
|
private final AmqpMsgManager amqpMsgManager;
|
||||||
|
|
||||||
private static final Integer REC_BOOK_COUNT = 4;
|
private static final Integer REC_BOOK_COUNT = 4;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -335,6 +339,8 @@ public class BookServiceImpl implements BookService {
|
|||||||
bookInfoMapper.updateById(newBookInfo);
|
bookInfoMapper.updateById(newBookInfo);
|
||||||
// b) 刷新小说信息缓存
|
// b) 刷新小说信息缓存
|
||||||
bookInfoCacheManager.cachePutBookInfo(dto.getBookId());
|
bookInfoCacheManager.cachePutBookInfo(dto.getBookId());
|
||||||
|
// c) 发送小说信息更新的 MQ 消息
|
||||||
|
amqpMsgManager.sendBookChangeMsg(dto.getBookId());
|
||||||
return RestResp.ok();
|
return RestResp.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ package io.github.xxyopen.novel.service.impl;
|
|||||||
import io.github.xxyopen.novel.core.common.resp.RestResp;
|
import io.github.xxyopen.novel.core.common.resp.RestResp;
|
||||||
import io.github.xxyopen.novel.dto.resp.HomeBookRespDto;
|
import io.github.xxyopen.novel.dto.resp.HomeBookRespDto;
|
||||||
import io.github.xxyopen.novel.dto.resp.HomeFriendLinkRespDto;
|
import io.github.xxyopen.novel.dto.resp.HomeFriendLinkRespDto;
|
||||||
import io.github.xxyopen.novel.manager.FriendLinkCacheManager;
|
import io.github.xxyopen.novel.manager.cache.FriendLinkCacheManager;
|
||||||
import io.github.xxyopen.novel.manager.HomeBookCacheManager;
|
import io.github.xxyopen.novel.manager.cache.HomeBookCacheManager;
|
||||||
import io.github.xxyopen.novel.service.HomeService;
|
import io.github.xxyopen.novel.service.HomeService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -8,7 +8,7 @@ import io.github.xxyopen.novel.dao.entity.NewsInfo;
|
|||||||
import io.github.xxyopen.novel.dao.mapper.NewsContentMapper;
|
import io.github.xxyopen.novel.dao.mapper.NewsContentMapper;
|
||||||
import io.github.xxyopen.novel.dao.mapper.NewsInfoMapper;
|
import io.github.xxyopen.novel.dao.mapper.NewsInfoMapper;
|
||||||
import io.github.xxyopen.novel.dto.resp.NewsInfoRespDto;
|
import io.github.xxyopen.novel.dto.resp.NewsInfoRespDto;
|
||||||
import io.github.xxyopen.novel.manager.NewsCacheManager;
|
import io.github.xxyopen.novel.manager.cache.NewsCacheManager;
|
||||||
import io.github.xxyopen.novel.service.NewsService;
|
import io.github.xxyopen.novel.service.NewsService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -6,7 +6,7 @@ import io.github.xxyopen.novel.core.common.exception.BusinessException;
|
|||||||
import io.github.xxyopen.novel.core.common.resp.RestResp;
|
import io.github.xxyopen.novel.core.common.resp.RestResp;
|
||||||
import io.github.xxyopen.novel.core.constant.SystemConfigConsts;
|
import io.github.xxyopen.novel.core.constant.SystemConfigConsts;
|
||||||
import io.github.xxyopen.novel.dto.resp.ImgVerifyCodeRespDto;
|
import io.github.xxyopen.novel.dto.resp.ImgVerifyCodeRespDto;
|
||||||
import io.github.xxyopen.novel.manager.VerifyCodeManager;
|
import io.github.xxyopen.novel.manager.redis.VerifyCodeManager;
|
||||||
import io.github.xxyopen.novel.service.ResourceService;
|
import io.github.xxyopen.novel.service.ResourceService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
@ -20,7 +20,7 @@ import io.github.xxyopen.novel.dto.req.UserRegisterReqDto;
|
|||||||
import io.github.xxyopen.novel.dto.resp.UserInfoRespDto;
|
import io.github.xxyopen.novel.dto.resp.UserInfoRespDto;
|
||||||
import io.github.xxyopen.novel.dto.resp.UserLoginRespDto;
|
import io.github.xxyopen.novel.dto.resp.UserLoginRespDto;
|
||||||
import io.github.xxyopen.novel.dto.resp.UserRegisterRespDto;
|
import io.github.xxyopen.novel.dto.resp.UserRegisterRespDto;
|
||||||
import io.github.xxyopen.novel.manager.VerifyCodeManager;
|
import io.github.xxyopen.novel.manager.redis.VerifyCodeManager;
|
||||||
import io.github.xxyopen.novel.service.UserService;
|
import io.github.xxyopen.novel.service.UserService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -11,15 +11,9 @@ spring:
|
|||||||
multipart:
|
multipart:
|
||||||
max-file-size: 5MB
|
max-file-size: 5MB
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
server:
|
server:
|
||||||
port: 8888
|
port: 8888
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
datasource:
|
datasource:
|
||||||
@ -30,10 +24,9 @@ spring:
|
|||||||
activate:
|
activate:
|
||||||
on-profile: dev
|
on-profile: dev
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
|
# Redis 配置
|
||||||
redis:
|
redis:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 6379
|
port: 6379
|
||||||
@ -41,6 +34,7 @@ spring:
|
|||||||
config:
|
config:
|
||||||
activate:
|
activate:
|
||||||
on-profile: dev
|
on-profile: dev
|
||||||
|
# Elasticsearch 配置
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
# 是否开启 elasticsearch 搜索引擎功能:true-开启 false-不开启
|
# 是否开启 elasticsearch 搜索引擎功能:true-开启 false-不开启
|
||||||
enable: false
|
enable: false
|
||||||
@ -48,6 +42,21 @@ spring:
|
|||||||
- https://my-deployment-ce7ca3.es.us-central1.gcp.cloud.es.io:9243
|
- https://my-deployment-ce7ca3.es.us-central1.gcp.cloud.es.io:9243
|
||||||
username: elastic
|
username: elastic
|
||||||
password: qTjgYVKSuExX6tWAsDuvuvwl
|
password: qTjgYVKSuExX6tWAsDuvuvwl
|
||||||
|
amqp:
|
||||||
|
# 是否开启 Spring AMQP:true-开启 false-不开启
|
||||||
|
enable: false
|
||||||
|
# RabbitMQ 配置
|
||||||
|
rabbitmq:
|
||||||
|
addresses: "amqp://guest:guest@47.106.243.172"
|
||||||
|
virtual-host: novel
|
||||||
|
template:
|
||||||
|
retry:
|
||||||
|
# 开启重试
|
||||||
|
enabled: true
|
||||||
|
# 最大重试次数
|
||||||
|
max-attempts: 3
|
||||||
|
# 第一次和第二次重试之间的持续时间
|
||||||
|
initial-interval: "3s"
|
||||||
|
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user