diff --git a/pom.xml b/pom.xml
index 0f462b2..23cbd88 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,6 +110,12 @@
jackson-databind
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
mysql
mysql-connector-java
diff --git a/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java b/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java
index 9881c03..8d394c8 100644
--- a/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java
+++ b/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java
@@ -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.util.JwtUtils;
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 java.util.Objects;
diff --git a/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java b/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java
index 31a1bfa..d6abcd6 100644
--- a/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java
+++ b/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java
@@ -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.util.JwtUtils;
import io.github.xxyopen.novel.dto.AuthorInfoDto;
-import io.github.xxyopen.novel.manager.AuthorInfoCacheManager;
-import io.github.xxyopen.novel.manager.UserInfoCacheManager;
+import io.github.xxyopen.novel.manager.cache.AuthorInfoCacheManager;
+import io.github.xxyopen.novel.manager.cache.UserInfoCacheManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
diff --git a/src/main/java/io/github/xxyopen/novel/core/auth/FrontAuthStrategy.java b/src/main/java/io/github/xxyopen/novel/core/auth/FrontAuthStrategy.java
index 1022281..2c69fb2 100644
--- a/src/main/java/io/github/xxyopen/novel/core/auth/FrontAuthStrategy.java
+++ b/src/main/java/io/github/xxyopen/novel/core/auth/FrontAuthStrategy.java
@@ -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.util.JwtUtils;
-import io.github.xxyopen.novel.manager.UserInfoCacheManager;
+import io.github.xxyopen.novel.manager.cache.UserInfoCacheManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
diff --git a/src/main/java/io/github/xxyopen/novel/core/common/constant/CommonConsts.java b/src/main/java/io/github/xxyopen/novel/core/common/constant/CommonConsts.java
index d69ec0c..e2fae0a 100644
--- a/src/main/java/io/github/xxyopen/novel/core/common/constant/CommonConsts.java
+++ b/src/main/java/io/github/xxyopen/novel/core/common/constant/CommonConsts.java
@@ -13,11 +13,14 @@ public class CommonConsts {
* 是
* */
public static final Integer YES = 1;
+ public static final String TRUE = "true";
+
/**
* 否
* */
public static final Integer NO = 0;
+ public static final String FALSE = "false";
/**
* 性别常量
diff --git a/src/main/java/io/github/xxyopen/novel/core/config/AmqpConfig.java b/src/main/java/io/github/xxyopen/novel/core/config/AmqpConfig.java
new file mode 100644
index 0000000..7df2b83
--- /dev/null
+++ b/src/main/java/io/github/xxyopen/novel/core/config/AmqpConfig.java
@@ -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());
+ }
+
+}
diff --git a/src/main/java/io/github/xxyopen/novel/core/constant/AmqpConsts.java b/src/main/java/io/github/xxyopen/novel/core/constant/AmqpConsts.java
new file mode 100644
index 0000000..7292bda
--- /dev/null
+++ b/src/main/java/io/github/xxyopen/novel/core/constant/AmqpConsts.java
@@ -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";
+
+ }
+
+}
diff --git a/src/main/java/io/github/xxyopen/novel/core/listener/RabbitQueueListener.java b/src/main/java/io/github/xxyopen/novel/core/listener/RabbitQueueListener.java
new file mode 100644
index 0000000..55d82f2
--- /dev/null
+++ b/src/main/java/io/github/xxyopen/novel/core/listener/RabbitQueueListener.java
@@ -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());
+ }
+
+}
diff --git a/src/main/java/io/github/xxyopen/novel/core/task/BookToEsTask.java b/src/main/java/io/github/xxyopen/novel/core/task/BookToEsTask.java
index 23ef4d9..a456e38 100644
--- a/src/main/java/io/github/xxyopen/novel/core/task/BookToEsTask.java
+++ b/src/main/java/io/github/xxyopen/novel/core/task/BookToEsTask.java
@@ -18,7 +18,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
-import java.time.ZoneOffset;
import java.util.List;
/**
@@ -60,12 +59,11 @@ public class BookToEsTask {
BulkRequest.Builder br = new BulkRequest.Builder();
for (BookInfo book : bookInfos) {
- EsBookDto esBook = buildEsBook(book);
br.operations(op -> op
.index(idx -> idx
.index(EsConsts.BookIndex.INDEX_NAME)
.id(book.getId().toString())
- .document(esBook)
+ .document(EsBookDto.build(book))
)
).timeout(Time.of(t -> t.time("10s")));
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();
- }
}
diff --git a/src/main/java/io/github/xxyopen/novel/dto/es/EsBookDto.java b/src/main/java/io/github/xxyopen/novel/dto/es/EsBookDto.java
index 3a714bc..1825e08 100644
--- a/src/main/java/io/github/xxyopen/novel/dto/es/EsBookDto.java
+++ b/src/main/java/io/github/xxyopen/novel/dto/es/EsBookDto.java
@@ -1,10 +1,13 @@
package io.github.xxyopen.novel.dto.es;
+import io.github.xxyopen.novel.dao.entity.BookInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.time.ZoneOffset;
+
/**
* Elasticsearch 存储小说 DTO
* @author xiongxiaoyang
@@ -101,4 +104,27 @@ public class EsBookDto {
*/
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();
+ }
+
}
diff --git a/src/main/java/io/github/xxyopen/novel/manager/AuthorInfoCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/AuthorInfoCacheManager.java
similarity index 97%
rename from src/main/java/io/github/xxyopen/novel/manager/AuthorInfoCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/AuthorInfoCacheManager.java
index cf099a0..c48ac8c 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/AuthorInfoCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/AuthorInfoCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/BookCategoryCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/BookCategoryCacheManager.java
similarity index 96%
rename from src/main/java/io/github/xxyopen/novel/manager/BookCategoryCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/BookCategoryCacheManager.java
index 4ba6993..a592a4a 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/BookCategoryCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/BookCategoryCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/BookChapterCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/BookChapterCacheManager.java
similarity index 96%
rename from src/main/java/io/github/xxyopen/novel/manager/BookChapterCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/BookChapterCacheManager.java
index 6288664..fe45fbe 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/BookChapterCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/BookChapterCacheManager.java
@@ -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.dao.entity.BookChapter;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/BookContentCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/BookContentCacheManager.java
similarity index 96%
rename from src/main/java/io/github/xxyopen/novel/manager/BookContentCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/BookContentCacheManager.java
index be0f8a6..ea21719 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/BookContentCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/BookContentCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/BookInfoCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/BookInfoCacheManager.java
similarity index 98%
rename from src/main/java/io/github/xxyopen/novel/manager/BookInfoCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/BookInfoCacheManager.java
index 00c1686..ba509c5 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/BookInfoCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/BookInfoCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/BookRankCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/BookRankCacheManager.java
similarity index 98%
rename from src/main/java/io/github/xxyopen/novel/manager/BookRankCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/BookRankCacheManager.java
index 16ef8cd..e616d52 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/BookRankCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/BookRankCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/FriendLinkCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/FriendLinkCacheManager.java
similarity index 97%
rename from src/main/java/io/github/xxyopen/novel/manager/FriendLinkCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/FriendLinkCacheManager.java
index 6564e7b..b1876d8 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/FriendLinkCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/FriendLinkCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/HomeBookCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/HomeBookCacheManager.java
similarity index 98%
rename from src/main/java/io/github/xxyopen/novel/manager/HomeBookCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/HomeBookCacheManager.java
index 1cc78cd..c94a95a 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/HomeBookCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/HomeBookCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/NewsCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/NewsCacheManager.java
similarity index 97%
rename from src/main/java/io/github/xxyopen/novel/manager/NewsCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/NewsCacheManager.java
index b60f4ad..6ffc5c8 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/NewsCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/NewsCacheManager.java
@@ -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 io.github.xxyopen.novel.core.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/UserInfoCacheManager.java b/src/main/java/io/github/xxyopen/novel/manager/cache/UserInfoCacheManager.java
similarity index 95%
rename from src/main/java/io/github/xxyopen/novel/manager/UserInfoCacheManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/cache/UserInfoCacheManager.java
index d9a1380..050db89 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/UserInfoCacheManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/cache/UserInfoCacheManager.java
@@ -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.dao.entity.UserInfo;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/UserDaoManager.java b/src/main/java/io/github/xxyopen/novel/manager/dao/UserDaoManager.java
similarity index 95%
rename from src/main/java/io/github/xxyopen/novel/manager/UserDaoManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/dao/UserDaoManager.java
index fe29c2f..7020f18 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/UserDaoManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/dao/UserDaoManager.java
@@ -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 io.github.xxyopen.novel.core.constant.DatabaseConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/manager/mq/AmqpMsgManager.java b/src/main/java/io/github/xxyopen/novel/manager/mq/AmqpMsgManager.java
new file mode 100644
index 0000000..ecdcb5c
--- /dev/null
+++ b/src/main/java/io/github/xxyopen/novel/manager/mq/AmqpMsgManager.java
@@ -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);
+ }
+
+}
diff --git a/src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java b/src/main/java/io/github/xxyopen/novel/manager/redis/VerifyCodeManager.java
similarity index 97%
rename from src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java
rename to src/main/java/io/github/xxyopen/novel/manager/redis/VerifyCodeManager.java
index b76708e..d6578c2 100644
--- a/src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java
+++ b/src/main/java/io/github/xxyopen/novel/manager/redis/VerifyCodeManager.java
@@ -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.constant.CacheConsts;
diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/AuthorServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/AuthorServiceImpl.java
index 1419a02..6c731bb 100644
--- a/src/main/java/io/github/xxyopen/novel/service/impl/AuthorServiceImpl.java
+++ b/src/main/java/io/github/xxyopen/novel/service/impl/AuthorServiceImpl.java
@@ -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.dto.AuthorInfoDto;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java
index c855bb1..ff694ba 100644
--- a/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java
+++ b/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java
@@ -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.UserCommentReqDto;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -62,6 +64,8 @@ public class BookServiceImpl implements BookService {
private final UserDaoManager userDaoManager;
+ private final AmqpMsgManager amqpMsgManager;
+
private static final Integer REC_BOOK_COUNT = 4;
@Override
@@ -335,6 +339,8 @@ public class BookServiceImpl implements BookService {
bookInfoMapper.updateById(newBookInfo);
// b) 刷新小说信息缓存
bookInfoCacheManager.cachePutBookInfo(dto.getBookId());
+ // c) 发送小说信息更新的 MQ 消息
+ amqpMsgManager.sendBookChangeMsg(dto.getBookId());
return RestResp.ok();
}
diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/HomeServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/HomeServiceImpl.java
index 02cb16b..7717ebb 100644
--- a/src/main/java/io/github/xxyopen/novel/service/impl/HomeServiceImpl.java
+++ b/src/main/java/io/github/xxyopen/novel/service/impl/HomeServiceImpl.java
@@ -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.dto.resp.HomeBookRespDto;
import io.github.xxyopen.novel.dto.resp.HomeFriendLinkRespDto;
-import io.github.xxyopen.novel.manager.FriendLinkCacheManager;
-import io.github.xxyopen.novel.manager.HomeBookCacheManager;
+import io.github.xxyopen.novel.manager.cache.FriendLinkCacheManager;
+import io.github.xxyopen.novel.manager.cache.HomeBookCacheManager;
import io.github.xxyopen.novel.service.HomeService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/NewsServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/NewsServiceImpl.java
index 1d41067..c8d7431 100644
--- a/src/main/java/io/github/xxyopen/novel/service/impl/NewsServiceImpl.java
+++ b/src/main/java/io/github/xxyopen/novel/service/impl/NewsServiceImpl.java
@@ -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.NewsInfoMapper;
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 lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java
index 1b5ea7c..4089d78 100644
--- a/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java
+++ b/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java
@@ -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.constant.SystemConfigConsts;
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 lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java
index 639d640..480bd83 100644
--- a/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java
+++ b/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java
@@ -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.UserLoginRespDto;
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 lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 23df130..41e220b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -11,15 +11,9 @@ spring:
multipart:
max-file-size: 5MB
-
-
server:
port: 8888
-
-
-
-
---
spring:
datasource:
@@ -30,10 +24,9 @@ spring:
activate:
on-profile: dev
-
-
---
spring:
+ # Redis 配置
redis:
host: 127.0.0.1
port: 6379
@@ -41,6 +34,7 @@ spring:
config:
activate:
on-profile: dev
+ # Elasticsearch 配置
elasticsearch:
# 是否开启 elasticsearch 搜索引擎功能:true-开启 false-不开启
enable: false
@@ -48,6 +42,21 @@ spring:
- https://my-deployment-ce7ca3.es.us-central1.gcp.cloud.es.io:9243
username: elastic
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: