From 2ffe43a4b6721d14e1a10a3ccb1180ac66c8aebe Mon Sep 17 00:00:00 2001 From: wind Date: Sat, 25 Mar 2023 23:26:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E7=9A=84=E5=9F=BA=E7=A1=80=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/aliyun/service/AlibabaSmsImpl.java | 31 ++++++++++-- .../main/java/kim/wind/sms/api/SmsBlend.java | 23 ++++++++- .../sms/comm/delayedTime/DelayedTime.java | 49 +++++++++++++++++++ .../kim/wind/sms/comm/delayedTime/Task.java | 13 +++++ .../sms/starter/config/SmsMainConfig.java | 10 +++- 5 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/DelayedTime.java create mode 100644 sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/Task.java diff --git a/sms-aggregation-aliyun/src/main/java/kim/wind/sms/aliyun/service/AlibabaSmsImpl.java b/sms-aggregation-aliyun/src/main/java/kim/wind/sms/aliyun/service/AlibabaSmsImpl.java index 3908b100..5e215c4a 100644 --- a/sms-aggregation-aliyun/src/main/java/kim/wind/sms/aliyun/service/AlibabaSmsImpl.java +++ b/sms-aggregation-aliyun/src/main/java/kim/wind/sms/aliyun/service/AlibabaSmsImpl.java @@ -12,6 +12,7 @@ import kim.wind.sms.aliyun.config.AlibabaSmsConfig; import kim.wind.sms.api.SmsBlend; import kim.wind.sms.api.callback.CallBack; import kim.wind.sms.comm.annotation.Restricted; +import kim.wind.sms.comm.delayedTime.DelayedTime; import kim.wind.sms.comm.entity.SmsResponse; import kim.wind.sms.comm.exception.SmsBlendException; import kim.wind.sms.comm.utils.HTTPUtils; @@ -19,11 +20,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.LinkedHashMap; import java.util.List; +import java.util.TimerTask; import java.util.concurrent.Executor; @EnableConfigurationProperties({AlibabaSmsConfig.class}) @@ -39,6 +39,9 @@ public class AlibabaSmsImpl implements SmsBlend { @Qualifier("smsExecutor") private Executor pool; + @Autowired + private DelayedTime delayed; + @Override @Restricted public SmsResponse sendMessage(String phone, String message) { @@ -131,10 +134,32 @@ public class AlibabaSmsImpl implements SmsBlend { @Override @Restricted - public void sendMessage(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { + public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { pool.execute(()->{ SmsResponse smsResponse = sendMessage(phone,templateId,messages); callBack.callBack(smsResponse); }); } + + @Override + @Restricted + public void delayedMessage(String phone, String message, Long delayedTime) { + this.delayed.schedule(new TimerTask() { + @Override + public void run() { + sendMessage(phone,message); + } + },delayedTime); + } + + @Override + @Restricted + public void delayedMessage(String phone, String templateId, LinkedHashMap messages, Long delayedTime) { + this.delayed.schedule(new TimerTask() { + @Override + public void run() { + sendMessage(phone,templateId,messages); + } + },delayedTime); + } } diff --git a/sms-aggregation-api/src/main/java/kim/wind/sms/api/SmsBlend.java b/sms-aggregation-api/src/main/java/kim/wind/sms/api/SmsBlend.java index e967e881..fea7952c 100644 --- a/sms-aggregation-api/src/main/java/kim/wind/sms/api/SmsBlend.java +++ b/sms-aggregation-api/src/main/java/kim/wind/sms/api/SmsBlend.java @@ -68,5 +68,26 @@ public interface SmsBlend { * @author :Wind */ - void sendMessage(String phone, String templateId, LinkedHashMap messages, CallBack callBack); + void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack); + + /** + *

说明: + * delayedMessage + * @param phone 接收短信的手机号 + * @param message 要发送的短信 + * @param delayedTime 延迟时间 + * @author :Wind + */ + void delayedMessage(String phone ,String message,Long delayedTime); + + /** + *

说明:使用自定义模板发送定时短信 sendMessage + * delayedMessage + * @param templateId 模板id + * @param messages key为模板变量名称 value为模板变量值 + * @param phone 要发送的手机号 + * @param delayedTime 延迟的时间 + * @author :Wind + */ + void delayedMessage(String phone ,String templateId, LinkedHashMap messages,Long delayedTime); } diff --git a/sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/DelayedTime.java b/sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/DelayedTime.java new file mode 100644 index 00000000..bda5e2b5 --- /dev/null +++ b/sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/DelayedTime.java @@ -0,0 +1,49 @@ +package kim.wind.sms.comm.delayedTime; + +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; + +/** + *

类名: DelayedTime + *

说明: 定时器队列 + * + * @author :Wind + * 2023/3/25 21:22 + **/ +public class DelayedTime { + + private final BlockingQueue queue = new PriorityBlockingQueue<>(); + + + + public DelayedTime() { + Timer timer = new Timer(true); + Thread t = new Thread(() -> { + while (true) try { + Task take = queue.take(); + timer.schedule(take.getRunnable(), take.getTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + t.start(); + } + + /** + * 延迟队列添加新任务 + */ + public void schedule(TimerTask task, long delay) { + try { + Task tasks = new Task(); + tasks.setTime(delay); + tasks.setRunnable(task); + queue.put(tasks); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/Task.java b/sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/Task.java new file mode 100644 index 00000000..a5328a3c --- /dev/null +++ b/sms-aggregation-comm/src/main/java/kim/wind/sms/comm/delayedTime/Task.java @@ -0,0 +1,13 @@ +package kim.wind.sms.comm.delayedTime; + +import lombok.Data; + +import java.util.TimerTask; + +@Data +public class Task{ + + private TimerTask runnable;//描述要执行的任务 + private long time;//什么时间执行,用时间戳来表示 + +} diff --git a/sms-aggregation-spring-boot-starter/src/main/java/kim/wind/sms/starter/config/SmsMainConfig.java b/sms-aggregation-spring-boot-starter/src/main/java/kim/wind/sms/starter/config/SmsMainConfig.java index c32265a0..289bf1ee 100644 --- a/sms-aggregation-spring-boot-starter/src/main/java/kim/wind/sms/starter/config/SmsMainConfig.java +++ b/sms-aggregation-spring-boot-starter/src/main/java/kim/wind/sms/starter/config/SmsMainConfig.java @@ -1,16 +1,16 @@ package kim.wind.sms.starter.config; -import kim.wind.sms.aliyun.config.AlibabaSmsConfig; import kim.wind.sms.aliyun.service.AlibabaSmsImpl; import kim.wind.sms.api.SmsBlend; +import kim.wind.sms.comm.delayedTime.DelayedTime; import kim.wind.sms.comm.utils.RedisUtils; +import kim.wind.sms.comm.utils.SpringUtil; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import kim.wind.sms.comm.utils.SpringUtil; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -96,9 +96,15 @@ public class SmsMainConfig { return new AopAdvice(); } + /** 如果启用了redis作为缓存则注入redis工具类*/ @Bean @ConditionalOnProperty(prefix = "sms", name = "redisCache", havingValue = "true") public RedisUtils redisUtils(RedisTemplate redisTemplate){ return new RedisUtils(redisTemplate); } + + @Bean + public DelayedTime delayedTime(){ + return new DelayedTime(); + } }