1. Agregue la dependencia del SDK de Alibaba
pom.xml
Agregue las siguientes dependencias al archivo :
<!-- 阿里大于SDK -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.3.2</version>
</dependency>
2. Configurar el servicio de SMS de Alibaba
application.properties
Agregue la siguiente configuración al archivo :
# 阿里大于短信服务配置
aliyun.sms.accessKeyId=your_accessKeyId
aliyun.sms.accessKeySecret=your_accessKeySecret
aliyun.sms.signName=your_signName
aliyun.sms.templateCode=your_templateCode
Entre ellos, accessKeyId
se accessKeySecret
encuentran la AccessKey en la consola de Alibaba Cloud, signName
la firma de SMS templateCode
y el ID de la plantilla de SMS.
3. Enviar SMS
En Spring Boot, podemos usar MQ para enviar mensajes de texto de forma asincrónica para mejorar la velocidad de respuesta del sistema. Aquí tomamos ActiveMQ como ejemplo para demostrar cómo integrar Alibaba y ActiveMQ para enviar mensajes de texto.
Primero, pom.xml
agregue la dependencia ActiveMQ al archivo:
<!-- ActiveMQ -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
4. application.properties
Agregue la configuración de ActiveMQ al archivo:
# ActiveMQ配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
5. Defina un Servicio para enviar mensajes de texto:
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
Clase utilizada para encapsular mensajes SMS:
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. Configure la cola de mensajes y el oyente en la clase de inicio:
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
La clase se utiliza para escuchar la cola de mensajes y enviar mensajes de texto:
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);
}
}
De esta forma, cuando llamemos SmsService
al sendSms
método, el mensaje SMS se enviará a la cola de mensajes. SmsMessageListener
Escuche la cola de mensajes y procese mensajes, y llame SmsService
al sendSms
método para enviar mensajes de texto. Debido a que enviar mensajes de texto es una operación que requiere un uso intensivo de IO, procesarlo de forma asincrónica puede mejorar la velocidad de respuesta del sistema.