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

其中,accessKeyIdaccessKeySecret是阿里云控制台上的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);
    }

}

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

相关推荐
canyuemanyue几秒前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man3 分钟前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟4 分钟前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity1 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天1 小时前
java的threadlocal为何内存泄漏
java
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋31 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端2 小时前
第六章 7.0 LinkList
java·开发语言·网络