springboot整合阿里大于并结合mq发送短信

1. 添加阿里大于SDK依赖

在pom.xml文件中添加以下依赖:

xml 复制代码
<!-- 阿里大于SDK -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>1.3.2</version>
</dependency>

2. 配置阿里大于短信服务

在application.properties文件中添加以下配置:

properties 复制代码
# 阿里大于短信服务配置
aliyun.sms.accessKeyId=your_accessKeyId
aliyun.sms.accessKeySecret=your_accessKeySecret
aliyun.sms.signName=your_signName
aliyun.sms.templateCode=your_templateCode

其中,accessKeyId和accessKeySecret是阿里云控制台上的AccessKey,signName是短信签名,templateCode是短信模板ID。

3. 发送短信

在Spring Boot中,我们可以使用MQ来异步发送短信,提高系统的响应速度。这里以ActiveMQ为例,演示如何整合阿里大于和ActiveMQ发送短信。

首先,在pom.xml文件中添加ActiveMQ依赖:

xml 复制代码
<!-- ActiveMQ -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.15.9</version>
</dependency>

4、在application.properties文件中添加ActiveMQ的配置:

properties 复制代码
# ActiveMQ配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin

5、定义一个发送短信的Service:

java 复制代码
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.sms.model.v20170525.SendSmsRequest;
import com.aliyuncs.sms.model.v20170525.SendSmsResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Map;

@Service
public class SmsService {

    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.sms.accessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.sms.signName}")
    private String signName;

    @Value("${aliyun.sms.templateCode}")
    private String templateCode;

    @Resource
    private JmsMessagingTemplate jmsMessagingTemplate;

    /**
     * 发送短信
     *
     * @param mobile   手机号
     * @param paramMap 短信参数
     */
    public void sendSms(String mobile, Map<String, String> paramMap) {
        jmsMessagingTemplate.convertAndSend("sms.queue", new SmsMessage(mobile, paramMap));
    }

    /**
     * 发送短信
     *
     * @param message 短信消息
     */
    public void sendSms(SmsMessage message) {
        DefaultProfile profile = DefaultProfile.getProfile("default", accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);
        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(message.getMobile());
        request.setSignName(signName);
        request.setTemplateCode(templateCode);
        request.setTemplateParam(message.getParamJson());
        try {
            SendSmsResponse response = client.getAcsResponse(request);
            if (response.getCode() != null && response.getCode().equals("OK")) {
                System.out.println("短信发送成功:" + message);
            } else {
                System.out.println("短信发送失败:" + message + ", " + response.getMessage());
            }
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

SmsMessage类用于封装短信消息:

java 复制代码
public class SmsMessage implements Serializable {

    private static final long serialVersionUID = 1L;

    private String mobile;

    private Map<String, String> paramMap;

    public SmsMessage() {
    }

    public SmsMessage(String mobile, Map<String, String> paramMap) {
        this.mobile = mobile;
        this.paramMap = paramMap;
    }

    // getter/setter
}

6、在启动类中配置消息队列和监听器:

java 复制代码
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import javax.jms.Queue;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public Queue smsQueue() {
        return new ActiveMQQueue("sms.queue");
    }

    @Bean
    public SmsMessageListener smsMessageListener() {
        return new SmsMessageListener();
    }

}

SmsMessageListener类用于监听消息队列并发送短信:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class SmsMessageListener {

    @Autowired
    private SmsService smsService;

    @JmsListener(destination = "sms.queue")
    public void receiveMessage(SmsMessage message) {
        smsService.sendSms(message);
    }

}

这样,当我们调用SmsService的sendSms方法时,短信消息会被发送到消息队列中。SmsMessageListener监听消息队列并处理消息,调用SmsService的sendSms方法发送短信。因为短信发送是一个IO密集型操作,把它异步处理可以提高系统的响应速度。

相关推荐
panxianren15 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
码事漫谈16 小时前
骂AI,会让它做得更好吗?
后端
sunshine22 girl16 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
萧瑟余晖16 小时前
Spring Boot 核心理念与快速上手
spring boot
陈随易17 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
省钱兄--zs17 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang17 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
架构技术专栏18 小时前
AI Agent 框架怎么选:从一次制度查询拆出技术边界
后端·面试
sunshine22 girl18 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat18 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba