定时任务启动腾讯云自动发送短信(双数据源)

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: 定时任务启动腾讯云自动发送短信(双数据源)

 SmsController:

package com.todod.warning.controller;
import com.todod.warning.service.ISmsService;
import com.todod.warning.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/edusms/sms")
@CrossOrigin
public class SmsController {
    @Autowired
    private ISmsService smsService;
    @GetMapping("send/{phone}")
    public R sendSms(
            @PathVariable String phone, // 路径变量,用于接收URL中的电话号码
            @RequestParam(value = "templateParam", required = false) String[] templateParams // 查询参数,用于接收URL中的模板参数数组
    ){
        // 调用service发送短信的方法,传入电话号码和模板参数数组
        boolean isSend = smsService.send(phone, templateParams);
        // 根据发送结果返回相应的响应
        if (isSend) {
            return R.ok(); // 发送成功,返回成功响应
        } else {
            return R.error("短信发送失败!"); // 发送失败,返回错误响应
        }
    }
}

image.gif

ISmsService:

package com.todod.warning.service;
import java.util.List;
public interface ISmsService {
    boolean send(String phone, String[] templateParam);
}

image.gif

SmsServiceImpl:

package com.todod.warning.service.impl;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.todod.warning.service.ISmsService;
import com.todod.warning.utils.ConstantSmsUtils;
import com.todod.warning.utils.RandomUtil;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SmsServiceImpl implements ISmsService {
    //发送短信的方法
    @Override
    public boolean send(String phone, String[] templateParam) {
        //判断手机号是否为空
        if (StringUtils.isEmpty(phone)){
            return false;
        }
        try{
            // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential("AKIDBAQhnfJlOs8OTJtEOBk5HJMFxZ0Cuc8S", "Jbv2uXzDF4gLtLbgZHm6YovvhFbjdXKt");
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("sms.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的  第二个参数是地域信息
            SmsClient client = new SmsClient(cred, "ap-beijing", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();
            //设置固定的参数
            req.setSmsSdkAppId("1400953332");// 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId
            req.setSignName("天津浪淘科技");//短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名
            req.setTemplateId("2321690");//模板 ID: 必须填写已审核通过的模板 ID
            /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
            //设置发送相关的参数
            String[] phoneNumberSet1 = {"+86"+phone};
            req.setPhoneNumberSet(phoneNumberSet1);//发送的手机号
            req.setTemplateParamSet(templateParam);//发送验证码
            //发送短信
            // 返回的resp是一个SendSmsResponse的实例,与请求对象对应
            SendSmsResponse resp = client.SendSms(req);
            System.out.println("resp"+resp);
            // 输出json格式的字符串回包
            System.out.println(SendSmsResponse.toJsonString(resp));
            return true;
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            return false;
        }
    }
}

image.gif

定时任务:

package com.todod.warning.utils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.todod.warning.controller.SmsController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
@Component
public class ScheduleTask {
    private static final Logger logger = LoggerFactory.getLogger(ScheduleTask.class);
    @Autowired
    @Qualifier("clickhouseJdbcTemplate")
    private JdbcTemplate clickhouseJdbcTemplate;
    @Autowired
    private SmsController smsController;
    @Value("${tencent.sms.phone}")
    private String phone;
    //    @Scheduled(cron = "0 0 3 * * ?")
    @Scheduled(fixedRate = 10000)
    @DS("slave")
    public void doTaskEveryDayAtNoon() {
        try {
            String clickhouseUrl = "jdbc:clickhouse://192.168.1.106:8123/qbdata_db";
            String user = "qbdata_db";
            String password = "qbdata_db";
            try (Connection connection = DriverManager.getConnection(clickhouseUrl, user, password);
                 PreparedStatement statement = connection.prepareStatement(
                         "SELECT count(*) FROM base_yw WHERE db_batch = formatDateTime(yesterday(), '%Y-%m-%d') AND api_type = ?")) {
                statement.setString(1, "1"); // Set the api_type value
                try (ResultSet resultSet = statement.executeQuery()) {
                    if (resultSet.next()) {
                        int count1 = resultSet.getInt(1);
                        if (count1 == 0) {
                            //获取昨天的数据
//                LocalDate yesterdayDate = LocalDate.now().minusDays(1);
                            LocalDate localDate = LocalDate.now();
                            int year = localDate.getYear(); // 获取年份
                            int month = localDate.getMonthValue(); // 获取月份(1-12)
                            int day = localDate.getDayOfMonth(); // 获取日(1-31)
                            String errorMsg = "蜜度接口数据获取失败";
                            String[] templateParam = new String[4];
                            templateParam[0] = String.valueOf(year);
                            templateParam[1] = String.valueOf(month);
                            templateParam[2] = String.valueOf(day);
                            templateParam[3] = errorMsg;
                            smsController.sendSms(phone, templateParam);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try (Connection connection = DriverManager.getConnection(clickhouseUrl, user, password);
                 PreparedStatement statement = connection.prepareStatement(
                         "SELECT count(*) FROM base_yw WHERE db_batch = formatDateTime(yesterday(), '%Y-%m-%d') AND api_type = ?")) {
                statement.setString(1, "2"); // Set the api_type value
                try (ResultSet resultSet = statement.executeQuery()) {
                    if (resultSet.next()) {
                        int count2 = resultSet.getInt(1);
                        if (count2 == 0) {
                            //获取昨天的数据
//                LocalDate yesterdayDate = LocalDate.now().minusDays(1);
                            LocalDate localDate = LocalDate.now();
                            int year = localDate.getYear(); // 获取年份
                            int month = localDate.getMonthValue(); // 获取月份(1-12)
                            int day = localDate.getDayOfMonth(); // 获取日(1-31)
                            String errorMsg = "蚁坊接口数据获取失败";
                            String[] templateParam = new String[4];
                            templateParam[0] = String.valueOf(year);
                            templateParam[1] = String.valueOf(month);
                            templateParam[2] = String.valueOf(day);
                            templateParam[3] = errorMsg;
                            smsController.sendSms(phone, templateParam);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try (Connection connection = DriverManager.getConnection(clickhouseUrl, user, password);
                 PreparedStatement statement = connection.prepareStatement(
                         "SELECT count(*) FROM base_yw WHERE db_batch = formatDateTime(yesterday(), '%Y-%m-%d') AND api_type = ?")) {
                statement.setString(1, "3"); // Set the api_type value
                try (ResultSet resultSet = statement.executeQuery()) {
                    if (resultSet.next()) {
                        int count3 = resultSet.getInt(1);
                        if (count3 == 0) {
                            //获取昨天的数据
//                LocalDate yesterdayDate = LocalDate.now().minusDays(1);
                            LocalDate localDate = LocalDate.now();
                            int year = localDate.getYear(); // 获取年份
                            int month = localDate.getMonthValue(); // 获取月份(1-12)
                            int day = localDate.getDayOfMonth(); // 获取日(1-31)
                            String errorMsg = "五节接口数据获取失败";
                            String[] templateParam = new String[4];
                            templateParam[0] = String.valueOf(year);
                            templateParam[1] = String.valueOf(month);
                            templateParam[2] = String.valueOf(day);
                            templateParam[3] = errorMsg;
                            smsController.sendSms(phone, templateParam);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

image.gif

R:

package com.todod.warning.utils;
public class R<T> {
    private int code;
    private String message;
    private T data;
    private R(int code, String message) {
        this.code = code;
        this.message = message;
    }
    public static <T> R<T> ok() {
        return new R<>(200, "成功");
    }
    public static <T> R<T> error(String message) {
        return new R<>(500, message);
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

image.gif

yaml:

server.port=9099
#设置默认的数据源或者数据源组,默认值即为master
spring.datasource.dynamic.primary=master
#è®¾ç½®ä¸¥æ ¼æ¨¡å¼,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则在未匹配到指定数据源时候使用默认数据源
spring.datasource.dynamic.strict=false  
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/qcfx_db?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=xiao1021
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:clickhouse://192.168.1.106:8123/qbdata_db
spring.datasource.dynamic.datasource.slave.username=qbdata_db
spring.datasource.dynamic.datasource.slave.password=qbdata_db
spring.datasource.dynamic.datasource.slave.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver
server.tomcat.protocolHeader=x-forwarded-proto
server.tomcat.remoteIpHeader=x-forwarded-for
server.tomcat.basedir=
server.tomcat.backgroundProcessorDelay=30
spring.thymeleaf.prefix=classpath:/static/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false  
mybatis-plus.mapper-locations: classpath:mapper/*Mapper.xml
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#腾讯云短信服务参数
#腾讯云账户secretId,secretKey
tencent.sms.keyId=AKIDBAQhnfJlOs8OTJtEOBk5HJMFxZ0Cuc8S
tencent.sms.keysecret=Jbv2uXzDF4gLtLbgZHm6YovvhFbjdXKt
tencent.sms.phone=18833703503
#短信应用ID: 短信SdkAppId在 [短信控制台] æ·»åŠ åº”ç”¨åŽç”Ÿæˆçš„å®žé™…SdkAppId
tencent.sms.smsSdkAppId=1400952592
#短信签名内容: 使用 UTF-8 ç¼–ç ï¼Œå¿…é¡»å¡«å†™å·²å®¡æ ¸é€šè¿‡çš„ç­¾å
tencent.sms.signName="天津浪淘科技"
#模板 ID: å¿…é¡»å¡«å†™å·²å®¡æ ¸é€šè¿‡çš„æ¨¡æ¿ ID
tencent.sms.templateId=2321690
# 腾讯云短信服务
tencent:
sms:
secret-id: "AKIDBAQhnfJlOs8OTJtEOBk5HJMFxZ0Cuc8S"
secret-key:"Jbv2uXzDF4gLtLbgZHm6YovvhFbjdXKt"
sdk-app-id: 1400952592
sign-name: "天津浪淘科技"
# 模板IDæ˜ å°„ï¼Œkey任意设置,valueä¸ºå®¡æ ¸é€šè¿‡æ¨¡æ¿ID
template-id-map:
register: "2321690"
forget: "2321690"

image.gif

TencentSmsProperties:

package com.todod.warning.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Data // lombok 省略get/set方法
@Component
@ConfigurationProperties(prefix = "tencent.sms")  // 读取配置文件中tencent.sms 为前缀的配置信息
public class TencentSmsProperties {
    /** 腾讯云账户密钥对secretId */
    private String secretId;
    /** 腾讯云账户密钥对secretKey */
    private String secretKey;
    /** 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId(位于[应用管理]中的[应用列表]),示例: 1400006666 (1400开头)*/
    private String sdkAppId;
    /** 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */
    private String signName;
    /** 模板 ID 哈希表: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看
     *  key: 模板名称(自定义);value: 模板 ID(腾讯云已通过模板)
     * */
    private Map<String, String> templateIdMap;
    /** 国际/港澳台短信 SenderId: 国内短信填空,默认未开通(国内短信不需要填写此项),如需开通请联系 [sms helper] */
    String senderid = "";
    /**短信号码扩展号: 默认未开通,如需开通请联系 [sms helper]   个人不需要填写*/
    private String extendCode = "";
}

image.gif


目录
相关文章
|
4月前
|
存储 监控 开发工具
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
75 0
|
API PHP 开发工具
漏刻有时API接口实战开发系列(11):腾讯云短信3.0sms开发SDK环境部署及配置的实战总结
漏刻有时API接口实战开发系列(11):腾讯云短信3.0sms开发SDK环境部署及配置的实战总结
250 0
|
Java API 开发工具
Java调用腾讯云短信接口,完成验证码的发送
一、前言 我们在一些网站注册页面,经常会见到手机验证码的存在,这些验证码一般的小公司都是去买一些大的厂家的短信服务,自己开发对小公司的成本花费太大了!今天小编就带着大家来学习一下腾讯云的短信接口,体验一下,自己实现!!!
343 0
Java调用腾讯云短信接口,完成验证码的发送
|
监控 小程序 网络安全
Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信
短信服务验证服务已经不是什么新鲜事了,但是免费的手机短信服务却不多见,本次利用Python3.0基于Twilio和腾讯云服务分别来体验一下国际短信和国内短信接口。
Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信
|
开发工具 Python
使用Python开通腾讯云短信(sms)【亲测有效·超详细】
填写要创建的签名信息,提交给审核即可(一般两小时审核完成) 这里有一些常用的标准模板,直接使用即可(模板也要进行审核)
207 0
使用Python开通腾讯云短信(sms)【亲测有效·超详细】
|
监控 Linux API
Zabbix配置腾讯云短信报警
Zabbix配置腾讯云短信报警
Zabbix配置腾讯云短信报警
|
运维 JavaScript Java
nodejs实现腾讯云短信发送提醒
在我们做运维或者小工具的时候,总会有些需要提醒的事情,比如服务器宕机或者天气提醒,但是发email又会不够及时或者可能会忽略,那么短信就是一个不错的选择了
nodejs实现腾讯云短信发送提醒
|
7月前
|
弹性计算 关系型数据库 MySQL
数据传输DTS腾讯云上的mysql同步到阿里云上的mysql可以操作吗?
数据传输DTS腾讯云上的mysql同步到阿里云上的mysql可以操作吗?
314 0
|
存储 云安全 大数据
【云计算和大数据平台】云计算平台和大数据平台(如阿里云、腾讯云、华为云等)的搭建和使用方法
【云计算和大数据平台】云计算平台和大数据平台(如阿里云、腾讯云、华为云等)的搭建和使用方法
452 0
|
7月前
|
安全 小程序 网络安全
阿里云腾讯云免费SSL证书托管系统的开发初衷
由于Google等公司推动,互联网安全趋势将SSL证书期限统一缩短至3个月,阿里云和腾讯云相继跟进。对于管理多个站点的小公司而言,手动维护变得繁琐。为自动化此过程,作者探索使用API解决方案。通过研究腾讯云API,成功实现证书的自动创建、审核和下载。为应对无免费到期提醒服务,作者创建计划任务,在证书到期前7天发送提醒,初期采用短信提醒,并增设公众号模板消息作为备选方案,完成到期提醒系统的构建。接下来的文章将讨论SSL证书的申请和下载流程。
155 2