添加了延迟短信的基础支持

This commit is contained in:
wind 2023-03-25 23:26:46 +08:00
parent d874a4b633
commit 2ffe43a4b6
5 changed files with 120 additions and 6 deletions

View File

@ -12,6 +12,7 @@ import kim.wind.sms.aliyun.config.AlibabaSmsConfig;
import kim.wind.sms.api.SmsBlend; import kim.wind.sms.api.SmsBlend;
import kim.wind.sms.api.callback.CallBack; import kim.wind.sms.api.callback.CallBack;
import kim.wind.sms.comm.annotation.Restricted; 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.entity.SmsResponse;
import kim.wind.sms.comm.exception.SmsBlendException; import kim.wind.sms.comm.exception.SmsBlendException;
import kim.wind.sms.comm.utils.HTTPUtils; 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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties; 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.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.TimerTask;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@EnableConfigurationProperties({AlibabaSmsConfig.class}) @EnableConfigurationProperties({AlibabaSmsConfig.class})
@ -39,6 +39,9 @@ public class AlibabaSmsImpl implements SmsBlend {
@Qualifier("smsExecutor") @Qualifier("smsExecutor")
private Executor pool; private Executor pool;
@Autowired
private DelayedTime delayed;
@Override @Override
@Restricted @Restricted
public SmsResponse sendMessage(String phone, String message) { public SmsResponse sendMessage(String phone, String message) {
@ -131,10 +134,32 @@ public class AlibabaSmsImpl implements SmsBlend {
@Override @Override
@Restricted @Restricted
public void sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) { public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
pool.execute(()->{ pool.execute(()->{
SmsResponse smsResponse = sendMessage(phone,templateId,messages); SmsResponse smsResponse = sendMessage(phone,templateId,messages);
callBack.callBack(smsResponse); 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<String, String> messages, Long delayedTime) {
this.delayed.schedule(new TimerTask() {
@Override
public void run() {
sendMessage(phone,templateId,messages);
}
},delayedTime);
}
} }

View File

@ -68,5 +68,26 @@ public interface SmsBlend {
* @author :Wind * @author :Wind
*/ */
void sendMessage(String phone, String templateId, LinkedHashMap<String,String> messages, CallBack callBack); void sendMessageAsync(String phone, String templateId, LinkedHashMap<String,String> messages, CallBack callBack);
/**
* <p>说明
* delayedMessage
* @param phone 接收短信的手机号
* @param message 要发送的短信
* @param delayedTime 延迟时间
* @author :Wind
*/
void delayedMessage(String phone ,String message,Long delayedTime);
/**
* <p>说明使用自定义模板发送定时短信 sendMessage
* delayedMessage
* @param templateId 模板id
* @param messages key为模板变量名称 value为模板变量值
* @param phone 要发送的手机号
* @param delayedTime 延迟的时间
* @author :Wind
*/
void delayedMessage(String phone ,String templateId, LinkedHashMap<String,String> messages,Long delayedTime);
} }

View File

@ -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;
/**
* <p>类名: DelayedTime
* <p>说明 定时器队列
*
* @author :Wind
* 2023/3/25 21:22
**/
public class DelayedTime {
private final BlockingQueue<Task> 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);
}
}
}

View File

@ -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;//什么时间执行,用时间戳来表示
}

View File

@ -1,16 +1,16 @@
package kim.wind.sms.starter.config; package kim.wind.sms.starter.config;
import kim.wind.sms.aliyun.config.AlibabaSmsConfig;
import kim.wind.sms.aliyun.service.AlibabaSmsImpl; import kim.wind.sms.aliyun.service.AlibabaSmsImpl;
import kim.wind.sms.api.SmsBlend; 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.RedisUtils;
import kim.wind.sms.comm.utils.SpringUtil;
import lombok.Data; import lombok.Data;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import kim.wind.sms.comm.utils.SpringUtil;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@ -96,9 +96,15 @@ public class SmsMainConfig {
return new AopAdvice(); return new AopAdvice();
} }
/** 如果启用了redis作为缓存则注入redis工具类*/
@Bean @Bean
@ConditionalOnProperty(prefix = "sms", name = "redisCache", havingValue = "true") @ConditionalOnProperty(prefix = "sms", name = "redisCache", havingValue = "true")
public RedisUtils redisUtils(RedisTemplate<String, Object> redisTemplate){ public RedisUtils redisUtils(RedisTemplate<String, Object> redisTemplate){
return new RedisUtils(redisTemplate); return new RedisUtils(redisTemplate);
} }
@Bean
public DelayedTime delayedTime(){
return new DelayedTime();
}
} }