forked from 15166072824/NO6
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSmsServiceImpl.java
More file actions
143 lines (127 loc) · 5.22 KB
/
SmsServiceImpl.java
File metadata and controls
143 lines (127 loc) · 5.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.cl.service.impl;
import com.cl.service.SmsService;
import com.cl.service.SyslogService;
import com.cl.entity.SyslogEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.regex.Pattern;
/**
* 短信服务实现类
* @author
* @email
* @date 2025-03-27 15:44:15
*/
@Service("smsService")
public class SmsServiceImpl implements SmsService {
private static final Logger logger = LoggerFactory.getLogger(SmsServiceImpl.class);
private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");
private static final int DEFAULT_MAX_RETRIES = 2;
@Autowired
private SyslogService syslogService;
@Override
public boolean sendSms(String phoneNumber, String message) {
if (!isValidPhoneNumber(phoneNumber)) {
logger.error("手机号码格式不正确: {}", phoneNumber);
saveSmsLog(phoneNumber, message, "发送失败:手机号码格式不正确", 0);
return false;
}
try {
boolean success = doSendSms(phoneNumber, message);
if (success) {
saveSmsLog(phoneNumber, message, "发送成功", 100);
logger.info("短信发送成功,手机号: {}", phoneNumber);
} else {
saveSmsLog(phoneNumber, message, "发送失败", 0);
logger.error("短信发送失败,手机号: {}", phoneNumber);
}
return success;
} catch (Exception e) {
saveSmsLog(phoneNumber, message, "发送异常:" + e.getMessage(), 0);
logger.error("短信发送异常,手机号: {},错误: {}", phoneNumber, e.getMessage());
return false;
}
}
@Override
public boolean sendSmsWithRetry(String phoneNumber, String message, int maxRetries) {
if (!isValidPhoneNumber(phoneNumber)) {
logger.error("手机号码格式不正确: {}", phoneNumber);
saveSmsLog(phoneNumber, message, "发送失败:手机号码格式不正确", 0);
return false;
}
int attempt = 0;
boolean success = false;
String lastError = "";
while (attempt <= maxRetries && !success) {
attempt++;
try {
success = doSendSms(phoneNumber, message);
if (success) {
saveSmsLog(phoneNumber, message, "发送成功,第" + attempt + "次尝试", 100);
logger.info("短信发送成功,手机号: {},第{}次尝试", phoneNumber, attempt);
return true;
} else {
lastError = "发送失败";
logger.warn("短信发送失败,手机号: {},第{}次尝试", phoneNumber, attempt);
if (attempt <= maxRetries) {
Thread.sleep(1000);
}
}
} catch (Exception e) {
lastError = e.getMessage();
logger.error("短信发送异常,手机号: {},第{}次尝试,错误: {}", phoneNumber, attempt, e.getMessage());
if (attempt <= maxRetries) {
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
}
}
saveSmsLog(phoneNumber, message, "发送失败,已重试" + maxRetries + "次,最后错误:" + lastError, 0);
logger.error("短信发送最终失败,手机号: {},已重试{}次", phoneNumber, maxRetries);
return false;
}
@Override
public boolean isValidPhoneNumber(String phoneNumber) {
if (phoneNumber == null || phoneNumber.trim().isEmpty()) {
return false;
}
return PHONE_PATTERN.matcher(phoneNumber.trim()).matches();
}
/**
* 实际发送短信的模拟实现
* @param phoneNumber 手机号码
* @param message 短信内容
* @return 是否发送成功
*/
private boolean doSendSms(String phoneNumber, String message) {
logger.info("【模拟短信发送】手机号: {},内容: {}", phoneNumber, message);
return true;
}
/**
* 保存短信发送日志到syslog表
* @param phoneNumber 手机号码
* @param message 短信内容
* @param result 发送结果
* @param time 耗时
*/
private void saveSmsLog(String phoneNumber, String message, String result, long time) {
try {
SyslogEntity syslog = new SyslogEntity();
syslog.setUsername("SMS_SERVICE");
syslog.setOperation("短信发送");
syslog.setMethod("SmsService.sendSms");
syslog.setParams("手机号: " + phoneNumber + ", 内容: " + message + ", 结果: " + result);
syslog.setTime(time);
syslog.setIp("127.0.0.1");
syslog.setAddtime(new Date());
syslogService.insert(syslog);
} catch (Exception e) {
logger.error("保存短信日志失败: {}", e.getMessage());
}
}
}