diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 083be38..0baa873 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -10,11 +10,14 @@
-
-
+
+
+
+
+
@@ -23,6 +26,9 @@
+
+
+
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 2014ea6..046d5bc 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -5,6 +5,9 @@
+
+
+
diff --git a/beacon-api/target/classes/bootstrap.yml b/beacon-api/target/classes/bootstrap.yml
index 5ac5b35..66a912a 100644
--- a/beacon-api/target/classes/bootstrap.yml
+++ b/beacon-api/target/classes/bootstrap.yml
@@ -1,7 +1,3 @@
-## 端口号
-#server:
-# port: 8080
-
# 服务名称
spring:
application:
@@ -13,17 +9,9 @@ spring:
cloud:
nacos:
discovery:
- server-addr: 192.168.1.113:8848
+ server-addr: 192.168.43.132:8848
# nacos配置中心地址:
config:
- server-addr: 192.168.1.113:8848
+ server-addr: 192.168.43.132:8848
file-extension: yml
# beacon-api-dev.yml
-
-# # rabbitMQ连接信息
-# rabbitmq:
-# host: 192.168.1.113
-# port: 5672
-# username: root
-# password: 19970213Dch.
-# virtual-host: /
diff --git a/beacon-api/target/classes/com/mashibing/ApiStarterApp.class b/beacon-api/target/classes/com/mashibing/ApiStarterApp.class
index f2f367e..866e792 100644
Binary files a/beacon-api/target/classes/com/mashibing/ApiStarterApp.class and b/beacon-api/target/classes/com/mashibing/ApiStarterApp.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class b/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class
index c550456..8431c2b 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class and b/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class b/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class
index 497e668..ea43ed3 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class and b/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/enums/SmsCodeEnum.class b/beacon-api/target/classes/com/mashibing/api/enums/SmsCodeEnum.class
deleted file mode 100644
index 9488cc7..0000000
Binary files a/beacon-api/target/classes/com/mashibing/api/enums/SmsCodeEnum.class and /dev/null differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class
index 339d714..f769bc7 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class
index d6d6e0d..5b7566e 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class and b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class
index cfcdf74..7ddab60 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class
index 8646feb..6624378 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class
index 0b5b7ab..3437166 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class
index 894991d..730e032 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class
index 6726798..12de050 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class
index 9a79574..aacefb0 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class differ
diff --git a/beacon-api/target/classes/com/mashibing/api/util/R.class b/beacon-api/target/classes/com/mashibing/api/util/R.class
index 300bbe2..fa7f958 100644
Binary files a/beacon-api/target/classes/com/mashibing/api/util/R.class and b/beacon-api/target/classes/com/mashibing/api/util/R.class differ
diff --git a/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class b/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class
index eb444b1..cb0b734 100644
Binary files a/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class and b/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class differ
diff --git a/beacon-common/pom.xml b/beacon-common/pom.xml
index 88d1e36..40c9404 100644
--- a/beacon-common/pom.xml
+++ b/beacon-common/pom.xml
@@ -26,6 +26,16 @@
spring-context
5.3.12
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ 2.12.5
+
\ No newline at end of file
diff --git a/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java b/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java
index f04cac3..88204e0 100644
--- a/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java
+++ b/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java
@@ -25,6 +25,7 @@ public enum ExceptionEnums {
ONE_MINUTE_LIMIT(-16,"1分钟限流规则生效,无法发送短信"),
ONE_HOUR_LIMIT(-17,"1小时限流规则生效,无法发送短信"),
NO_CHANNEL(-18,"没有选择到合适的通道"),
+ SEARCH_INDEX_ERROR(-19,"添加ES文档信息失败")
;
private Integer code;
diff --git a/beacon-common/src/main/java/com/mashibing/common/exception/SearchException.java b/beacon-common/src/main/java/com/mashibing/common/exception/SearchException.java
new file mode 100644
index 0000000..b313ccd
--- /dev/null
+++ b/beacon-common/src/main/java/com/mashibing/common/exception/SearchException.java
@@ -0,0 +1,26 @@
+package com.mashibing.common.exception;
+
+import com.mashibing.common.enums.ExceptionEnums;
+import lombok.Getter;
+
+/**
+ * @author dch
+ * @create 2024-03-20 12:15
+ */
+@Getter
+public class SearchException extends RuntimeException {
+
+ private Integer code;
+
+ public SearchException(String message, Integer code) {
+ super(message);
+ this.code = code;
+ }
+
+
+ public SearchException(ExceptionEnums enums) {
+ super(enums.getMsg());
+ this.code = enums.getCode();
+ }
+
+}
diff --git a/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java b/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java
index bead5df..6445b00 100644
--- a/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java
+++ b/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java
@@ -5,6 +5,11 @@ package com.mashibing.common.model;
* @create 2024-03-24 17:05
*/
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -47,6 +52,9 @@ public class StandardReport implements Serializable {
/**
* 短信的发送时间,当前系统时间
*/
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @JsonSerialize(using = LocalDateTimeSerializer.class)
+ @JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime sendTime;
/**
@@ -61,10 +69,14 @@ public class StandardReport implements Serializable {
/**
* 回调的信息
- *
*/
private Integer isCallback;
private String callbackUrl;
+ /**
+ * 推送报告重试的次数
+ */
+ private Integer resendCount = 0;
+
}
\ No newline at end of file
diff --git a/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java b/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java
index b32bada..de50ea0 100644
--- a/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java
+++ b/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java
@@ -1,5 +1,10 @@
package com.mashibing.common.model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -56,6 +61,9 @@ public class StandardSubmit implements Serializable {
/**
* 短信的发送时间,当前系统时间
*/
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @JsonSerialize(using = LocalDateTimeSerializer.class)
+ @JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime sendTime;
/**
diff --git a/beacon-common/src/main/java/com/mashibing/common/util/JsonUtil.java b/beacon-common/src/main/java/com/mashibing/common/util/JsonUtil.java
new file mode 100644
index 0000000..da8f51f
--- /dev/null
+++ b/beacon-common/src/main/java/com/mashibing/common/util/JsonUtil.java
@@ -0,0 +1,21 @@
+package com.mashibing.common.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * @author dch
+ * @create 2024-03-25 22:20
+ */
+public class JsonUtil {
+ private static ObjectMapper objectMapper = new ObjectMapper();
+
+ public static String obj2JSON(Object obj){
+ try {
+ return objectMapper.writeValueAsString(obj);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ throw new RuntimeException("转换JSON失败!");
+ }
+ }
+}
diff --git a/beacon-push/pom.xml b/beacon-push/pom.xml
new file mode 100644
index 0000000..b81fba9
--- /dev/null
+++ b/beacon-push/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ com.mashibing
+ beacon-cloud
+ 1.0-SNAPSHOT
+
+
+ beacon-push
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.mashibing
+ beacon-common
+ 1.0-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+
\ No newline at end of file
diff --git a/beacon-push/src/main/java/com/mashibing/push/PushStarterApp.java b/beacon-push/src/main/java/com/mashibing/push/PushStarterApp.java
new file mode 100644
index 0000000..c00c9b2
--- /dev/null
+++ b/beacon-push/src/main/java/com/mashibing/push/PushStarterApp.java
@@ -0,0 +1,19 @@
+package com.mashibing.push;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * @author dch
+ * @create 2024-03-25 23:59
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+public class PushStarterApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PushStarterApp.class,args);
+ }
+
+}
\ No newline at end of file
diff --git a/beacon-push/src/main/java/com/mashibing/push/config/RabbitMQConfig.java b/beacon-push/src/main/java/com/mashibing/push/config/RabbitMQConfig.java
new file mode 100644
index 0000000..e11af5e
--- /dev/null
+++ b/beacon-push/src/main/java/com/mashibing/push/config/RabbitMQConfig.java
@@ -0,0 +1,47 @@
+package com.mashibing.push.config;
+
+import org.springframework.amqp.core.*;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author dch
+ * @create 2024-03-26 1:00
+ */
+@Configuration
+public class RabbitMQConfig {
+
+ public static final String DELAYED_EXCHANGE = "push_delayed_exchange";
+
+ public static final String DELAYED_QUEUE = "push_delayed_queue";
+
+ private static final String DELAYED_EXCHANGE_TYPE = "x-delayed-message";
+
+ private static final String DELAYED_ROUTING_TYPE_KEY = "x-delayed-type";
+
+ private static final String DELAYED_ROUTING_TYPE_FANOUT = "fanout";
+
+ @Bean
+ public Exchange delayedExchange(){
+ Map args = new HashMap<>();
+ //延迟交换机的路由类型----fanout
+ args.put(DELAYED_ROUTING_TYPE_KEY,DELAYED_ROUTING_TYPE_FANOUT);
+ Exchange delayedExchange = new CustomExchange(DELAYED_EXCHANGE,DELAYED_EXCHANGE_TYPE,false,false,args);
+ return delayedExchange;
+ }
+
+ @Bean
+ public Queue delayedQueue(){
+ return QueueBuilder.durable(DELAYED_QUEUE).build();
+ }
+
+ @Bean
+ public Binding delayedBinding(Exchange delayedExchange, Queue delayedQueue){
+ return BindingBuilder.bind(delayedQueue).to(delayedExchange).with("").noargs();
+ }
+
+
+}
\ No newline at end of file
diff --git a/beacon-push/src/main/java/com/mashibing/push/config/RestTemplateConfig.java b/beacon-push/src/main/java/com/mashibing/push/config/RestTemplateConfig.java
new file mode 100644
index 0000000..0a40621
--- /dev/null
+++ b/beacon-push/src/main/java/com/mashibing/push/config/RestTemplateConfig.java
@@ -0,0 +1,25 @@
+package com.mashibing.push.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @author dch
+ * @create 2024-03-26 0:07
+ */
+@Configuration
+@Slf4j
+public class RestTemplateConfig {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
\ No newline at end of file
diff --git a/beacon-push/src/main/java/com/mashibing/push/mq/PushReportListener.java b/beacon-push/src/main/java/com/mashibing/push/mq/PushReportListener.java
new file mode 100644
index 0000000..f5a6807
--- /dev/null
+++ b/beacon-push/src/main/java/com/mashibing/push/mq/PushReportListener.java
@@ -0,0 +1,146 @@
+package com.mashibing.push.mq;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.mashibing.common.constant.RabbitMQConstants;
+import com.mashibing.common.model.StandardReport;
+import com.mashibing.common.util.JsonUtil;
+import com.mashibing.push.config.RabbitMQConfig;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.AmqpException;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessagePostProcessor;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+
+import java.io.IOException;
+
+/**
+ * @author dch
+ * @create 2024-03-26 0:05
+ */
+@Component
+@Slf4j
+public class PushReportListener {
+
+ // 重试的时间间隔。
+ private int[] delayTime = {0, 15000, 30000, 60000, 300000};
+
+ private final String SUCCESS = "SUCCESS";
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @Autowired
+ private RabbitTemplate rabbitTemplate;
+
+
+ /**
+ * 监控策略模块推送过来的消息(暂时是策略)
+ *
+ * @param report
+ * @param channel
+ * @param message
+ * @throws IOException
+ */
+ @RabbitListener(queues = RabbitMQConstants.SMS_PUSH_REPORT)
+ public void consume(StandardReport report, Channel channel, Message message) throws IOException {
+ //1、获取客户的回调地址
+ String callbackUrl = report.getCallbackUrl();
+ if (StringUtils.isEmpty(callbackUrl)) {
+ log.info("【推送模块-推送状态报告】 客户方没有设置回调的地址信息!callbackUrl = {} ", callbackUrl);
+ channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+ return;
+ }
+
+ //2、发送状态报告
+ boolean flag = pushReport(report);
+
+ //3、如果发送失败,重试
+ isResend(report, flag);
+
+ //4、直接手动ack
+ channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+ }
+
+
+ /**
+ * 监听延迟交换机路由过来的消息
+ *
+ * @param report
+ * @param channel
+ * @param message
+ * @throws IOException
+ */
+ @RabbitListener(queues = RabbitMQConfig.DELAYED_QUEUE)
+ public void delayedConsume(StandardReport report, Channel channel, Message message) throws IOException {
+ // 1、发送状态报告
+ boolean flag = pushReport(report);
+
+ // 2、判断状态报告发送情况
+ isResend(report, flag);
+
+ // 手动ack
+ channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+ }
+
+
+ /**
+ * 发送请求,给callbackUrl
+ *
+ * @param report
+ * @return
+ */
+ private boolean pushReport(StandardReport report) {
+ // 声明返回结果,你默认为false
+ boolean flag = false;
+
+ //1、声明发送的参数
+ String body = JsonUtil.obj2JSON(report);
+
+ //2、声明RestTemplate的模板代码
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+ try {
+ log.info("【推送模块-推送状态报告】 第{}次推送状态报告开始!report = {}", report.getResendCount() + 1, report);
+ String result = restTemplate.postForObject("http://" + report.getCallbackUrl(), new HttpEntity<>(body, httpHeaders), String.class);
+ flag = SUCCESS.equals(result);
+ } catch (RestClientException e) {
+ }
+ //3、得到响应后,确认是否为SUCCESS
+ return flag;
+ }
+
+ /**
+ * 判断状态报告是否推送成功,失败的话需要发送重试消息
+ *
+ * @param report
+ * @param flag
+ */
+ private void isResend(StandardReport report, boolean flag) {
+ if (!flag) {
+ log.info("【推送模块-推送状态报告】 第{}次推送状态报告失败!report = {}", report.getResendCount() + 1, report);
+ report.setResendCount(report.getResendCount() + 1);
+ rabbitTemplate.convertAndSend(RabbitMQConfig.DELAYED_EXCHANGE, "", report, new MessagePostProcessor() {
+ @Override
+ public Message postProcessMessage(Message message) throws AmqpException {
+ // 设置延迟时间
+ message.getMessageProperties().setDelay(delayTime[report.getResendCount()]);
+ return message;
+ }
+ });
+ } else {
+ log.info("【推送模块-推送状态报告】 第一次推送状态报告成功!report = {}", report);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/beacon-push/src/main/resources/bootstrap.yml b/beacon-push/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..3ddf537
--- /dev/null
+++ b/beacon-push/src/main/resources/bootstrap.yml
@@ -0,0 +1,17 @@
+# 服务名称
+spring:
+ application:
+ name: beacon-push
+ # 多环境
+ profiles:
+ active: dev
+ # nacos注册中心地址
+ cloud:
+ nacos:
+ discovery:
+ server-addr: 192.168.43.132:8848
+ # nacos配置中心地址:
+ config:
+ server-addr: 192.168.43.132:8848
+ file-extension: yml
+ # beacon-push-dev.yml
\ No newline at end of file
diff --git a/beacon-search/pom.xml b/beacon-search/pom.xml
new file mode 100644
index 0000000..1e57913
--- /dev/null
+++ b/beacon-search/pom.xml
@@ -0,0 +1,65 @@
+
+
+ 4.0.0
+
+ com.mashibing
+ beacon-cloud
+ 1.0-SNAPSHOT
+
+
+ beacon-search
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.mashibing
+ beacon-common
+ 1.0-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+ org.elasticsearch.client
+ elasticsearch-rest-high-level-client
+ 7.6.2
+
+
+ org.elasticsearch
+ elasticsearch
+ 7.6.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+
\ No newline at end of file
diff --git a/beacon-search/src/main/java/com/mashibing/search/SearchStarterApp.java b/beacon-search/src/main/java/com/mashibing/search/SearchStarterApp.java
new file mode 100644
index 0000000..92af7ec
--- /dev/null
+++ b/beacon-search/src/main/java/com/mashibing/search/SearchStarterApp.java
@@ -0,0 +1,18 @@
+package com.mashibing.search;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * @author dch
+ * @create 2024-03-25 20:43
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+public class SearchStarterApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SearchStarterApp.class,args);
+ }
+}
\ No newline at end of file
diff --git a/beacon-search/src/main/java/com/mashibing/search/config/RestHighLevelClientConfig.java b/beacon-search/src/main/java/com/mashibing/search/config/RestHighLevelClientConfig.java
new file mode 100644
index 0000000..ad2163a
--- /dev/null
+++ b/beacon-search/src/main/java/com/mashibing/search/config/RestHighLevelClientConfig.java
@@ -0,0 +1,57 @@
+package com.mashibing.search.config;
+
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+
+/**
+ * @author dch
+ * @create 2024-03-25 21:02
+ */
+@Configuration
+public class RestHighLevelClientConfig {
+
+ @Value("#{'${elasticsearch.hostAndPorts}'.split(',')}")
+ private List hostAndPorts;
+
+ @Value("${elasticsearch.username:elastic}")
+ private String username;
+
+
+ @Value("${elasticsearch.password}")
+ private String password;
+
+ @Bean
+ public RestHighLevelClient restHighLevelClient(){
+ // 初始化连接ES的HttpHost信息
+ HttpHost[] httpHosts = new HttpHost[hostAndPorts.size()];
+ for (int i = 0; i < hostAndPorts.size(); i++) {
+ String[] hostAndPort = hostAndPorts.get(i).split(":");
+ httpHosts[i] = new HttpHost(hostAndPort[0],Integer.parseInt(hostAndPort[1]));
+ }
+
+ // 设置认证信息
+ CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+ credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(username,password));
+
+ // 构建时设置连接信息,基于set设置认证信息
+ RestClientBuilder restClientBuilder = RestClient.builder(httpHosts);
+ restClientBuilder.setHttpClientConfigCallback(f -> f.setDefaultCredentialsProvider(credentialsProvider));
+
+ // 构建连接ES的client对象
+ RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
+
+ // 返回
+ return restHighLevelClient;
+ }
+}
\ No newline at end of file
diff --git a/beacon-search/src/main/java/com/mashibing/search/mq/SmsWriteLogListener.java b/beacon-search/src/main/java/com/mashibing/search/mq/SmsWriteLogListener.java
new file mode 100644
index 0000000..d482c66
--- /dev/null
+++ b/beacon-search/src/main/java/com/mashibing/search/mq/SmsWriteLogListener.java
@@ -0,0 +1,46 @@
+package com.mashibing.search.mq;
+
+import com.mashibing.common.constant.RabbitMQConstants;
+import com.mashibing.common.model.StandardSubmit;
+import com.mashibing.common.util.JsonUtil;
+import com.mashibing.search.service.SearchService;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+
+/**
+ * @author dch
+ * @create 2024-03-25 21:16
+ */
+@Component
+@Slf4j
+public class SmsWriteLogListener {
+
+ @Autowired
+ private SearchService searchService;
+
+ private final String INDEX = "sms_submit_log_";
+
+
+ @RabbitListener(queues = RabbitMQConstants.SMS_WRITE_LOG)
+ public void consume(StandardSubmit submit, Channel channel, Message message) throws IOException {
+ //1、调用搜索模块的添加方法,完成添加操作
+ log.info("接收到存储日志的信息 submit = {}",submit);
+ searchService.index(INDEX + getYear(),submit.getSequenceId().toString(), JsonUtil.obj2JSON(submit));
+
+ //2、手动ack
+ channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
+ }
+
+
+ public String getYear(){
+ return LocalDateTime.now().getYear() + "";
+ }
+
+}
\ No newline at end of file
diff --git a/beacon-search/src/main/java/com/mashibing/search/service/SearchService.java b/beacon-search/src/main/java/com/mashibing/search/service/SearchService.java
new file mode 100644
index 0000000..f3a63da
--- /dev/null
+++ b/beacon-search/src/main/java/com/mashibing/search/service/SearchService.java
@@ -0,0 +1,18 @@
+package com.mashibing.search.service;
+
+import java.io.IOException;
+
+/**
+ * @author dch
+ * @create 2024-03-25 21:34
+ */
+public interface SearchService {
+ /**
+ * 向ES中添加一行文档
+ *
+ * @param index 索引信息
+ * @param id 文档id
+ * @param json 具体的文档内容
+ */
+ void index(String index, String id, String json) throws IOException;
+}
diff --git a/beacon-search/src/main/java/com/mashibing/search/service/impl/ElasticsearchServiceImpl.java b/beacon-search/src/main/java/com/mashibing/search/service/impl/ElasticsearchServiceImpl.java
new file mode 100644
index 0000000..66e3aab
--- /dev/null
+++ b/beacon-search/src/main/java/com/mashibing/search/service/impl/ElasticsearchServiceImpl.java
@@ -0,0 +1,55 @@
+package com.mashibing.search.service.impl;
+
+
+import com.mashibing.common.enums.ExceptionEnums;
+import com.mashibing.common.exception.SearchException;
+import com.mashibing.search.service.SearchService;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+
+/**
+ * @author dch
+ * @create 2024-03-25 21:34
+ */
+@Service
+@Slf4j
+public class ElasticsearchServiceImpl implements SearchService {
+ /**
+ * 添加成功的result
+ */
+ private final String CREATED = "created";
+
+ @Autowired
+ private RestHighLevelClient restHighLevelClient;
+
+ @Override
+ public void index(String index, String id, String json) throws IOException {
+ //1、构建插入数据的Request
+ IndexRequest request = new IndexRequest();
+
+ //2、给request对象封装索引信息,文档id,以及文档内容
+ request.index(index);
+ request.id(id);
+ request.source(json, XContentType.JSON);
+
+ //3、将request信息发送给ES服务
+ IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
+
+ //4、校验添加是否成功
+ String result = response.getResult().getLowercase();
+ if(!CREATED.equals(result)){
+ // 添加失败!!
+ log.error("【搜索模块-写入数据失败】 index = {},id = {},json = {},result = {}",index,id,json,result);
+ throw new SearchException(ExceptionEnums.SEARCH_INDEX_ERROR);
+ }
+ log.info("【搜索模块-写入数据成功】 索引添加成功index = {},id = {},json = {},result = {}",index,id,json,result);
+ }
+}
\ No newline at end of file
diff --git a/beacon-search/src/main/resources/bootstrap.yml b/beacon-search/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..74d12b7
--- /dev/null
+++ b/beacon-search/src/main/resources/bootstrap.yml
@@ -0,0 +1,17 @@
+# 服务名称
+spring:
+ application:
+ name: beacon-search
+ # 多环境
+ profiles:
+ active: dev
+ # nacos注册中心地址
+ cloud:
+ nacos:
+ discovery:
+ server-addr: 192.168.43.132:8848
+ # nacos配置中心地址:
+ config:
+ server-addr: 192.168.43.132:8848
+ file-extension: yml
+ # beacon-search-dev.yml
\ No newline at end of file
diff --git a/beacon-search/src/test/java/com/mashibing/search/service/SearchServiceTest.java b/beacon-search/src/test/java/com/mashibing/search/service/SearchServiceTest.java
new file mode 100644
index 0000000..2f6deb0
--- /dev/null
+++ b/beacon-search/src/test/java/com/mashibing/search/service/SearchServiceTest.java
@@ -0,0 +1,28 @@
+package com.mashibing.search.service;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author dch
+ * @create 2024-03-25 21:49
+ */
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class SearchServiceTest {
+
+ @Autowired
+ private SearchService searchService;
+
+ @Test
+ public void index() throws IOException {
+ searchService.index("sms_submit_log_2024","1","{\"clientId\":1}");
+ }
+}
\ No newline at end of file
diff --git a/beacon-smsgateway/pom.xml b/beacon-smsgateway/pom.xml
new file mode 100644
index 0000000..a47bbc1
--- /dev/null
+++ b/beacon-smsgateway/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ com.mashibing
+ beacon-cloud
+ 1.0-SNAPSHOT
+
+
+ beacon-smsgateway
+ 短信网关模块的模板
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.mashibing
+ beacon-common
+ 1.0-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+
\ No newline at end of file
diff --git a/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/SmsGatewayStarterApp.java b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/SmsGatewayStarterApp.java
new file mode 100644
index 0000000..7a40373
--- /dev/null
+++ b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/SmsGatewayStarterApp.java
@@ -0,0 +1,17 @@
+package com.mashibing.smsgateway;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * @author dch
+ * @create 2024-03-26 2:01
+ */
+@EnableDiscoveryClient
+@SpringBootApplication
+public class SmsGatewayStarterApp {
+ public static void main(String[] args) {
+ SpringApplication.run(SmsGatewayStarterApp.class, args);
+ }
+}
diff --git a/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/mq/SmsGatewayListener.java b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/mq/SmsGatewayListener.java
new file mode 100644
index 0000000..cbf665a
--- /dev/null
+++ b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/mq/SmsGatewayListener.java
@@ -0,0 +1,29 @@
+package com.mashibing.smsgateway.mq;
+
+import com.mashibing.common.model.StandardSubmit;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @author dch
+ * @create 2024-03-26 2:12
+ */
+@Component
+@Slf4j
+public class SmsGatewayListener {
+
+ @RabbitListener(queues = "${gateway.sendtopic}")
+ public void consume(StandardSubmit submit, Channel channel, Message message) throws IOException, InterruptedException {
+ log.info("【短信网关模块】 接收到消息 submit = {}", submit);
+ // =====================完成运营商交互,发送一次请求,接收两次响应==========================
+
+ channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+ }
+
+
+}
\ No newline at end of file
diff --git a/beacon-smsgateway/src/main/resources/bootstrap.yml b/beacon-smsgateway/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..07b78bb
--- /dev/null
+++ b/beacon-smsgateway/src/main/resources/bootstrap.yml
@@ -0,0 +1,16 @@
+# 服务名称
+spring:
+ application:
+ name: beacon-smsgateway
+ # 多环境
+ profiles:
+ active: dev
+ # nacos注册中心地址
+ cloud:
+ nacos:
+ discovery:
+ server-addr: 192.168.43.132:8848
+ # nacos配置中心地址:
+ config:
+ server-addr: 192.168.43.132:8848
+ file-extension: yml
\ No newline at end of file
diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java b/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java
index 12b9060..ad57ea0 100644
--- a/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java
+++ b/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java
@@ -37,7 +37,7 @@ public class RabbitTemplateConfig {
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
// ack为false,代表消息没有发送到exchange。
if(!ack){
- log.error("【接口模块-发送消息】 消息没有发送到交换机,correlationData = {},cause = {}",correlationData,cause);
+ log.error("【策略模块-发送消息】 消息没有发送到交换机,correlationData = {},cause = {}",correlationData,cause);
}
}
});
@@ -48,7 +48,7 @@ public class RabbitTemplateConfig {
// 触发这个回调,说明交换机没有把消息路由到指定的队列中
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
- log.error("【接口模块-发送消息】 消息没有路由到指定的Queue。 message = {},exchange = {},routingKey = {}",
+ log.error("【策略模块-发送消息】 消息没有路由到指定的Queue。 message = {},exchange = {},routingKey = {}",
new String(message.getBody()),exchange,routingKey);
}
});
diff --git a/pom.xml b/pom.xml
index 50d13e5..a5dddbe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,9 @@
beacon-cache
beacon-test
beacon-strategy
+ beacon-search
+ beacon-push
+ beacon-smsgateway