• SpringBoot+阿里大于+ActiveMq实现短信发送


    准备工作:

      注册阿里云账号并实名认证,

           进入短信控制台,添加签名和模板管理

    申请好accesskey并记录好申请结果

    一、创建一个maven项目:send-sms-message

     

     二、项目创好后加pom依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.dengfeng</groupId>
      <artifactId>send-sms-message</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
        <properties>   
        <java.version>1.7</java.version>
      </properties>
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
      </parent>  
      <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>    
        <dependency>
               <groupId>com.aliyun</groupId>
               <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
               <version>1.0.0-SNAPSHOT</version>
           </dependency>
           <dependency>
               <groupId>com.aliyun</groupId>
               <artifactId>aliyun-java-sdk-core</artifactId>
               <version>3.3.1</version>
           </dependency>
      </dependencies>
      
    </project>
    aliyun-java-sdk-core和aliyun-java-sdk-dysmsapi这2个包加入之后,项目可能会报错,需要到阿里云下载sdk
    登录后选短信服务

    选帮助文档

     

     

     下载后解压有2个文件夹

    然后将java→api-sdk→aliyun-java-sdk-core文件夹下面的aliyun-java-sdk-core-3.3.1.jar和java→api-sdk→aliyun-java-sdk-dysmsapi文件下面的aliyun-java-sdk-dysmsapi-1.0.0.jar

    包打到本地仓库即可

    三、在src/main/resource下创建application.properties文件

    server.port=9003
    spring.activemq.broker-url=tcp://192.168.25.129:61616
    accessKeyId=LTAIzZ8R6HPHVEq8
    accessKeySecret=0k2PDt5rjns1HaKAa1I4M3zHFudQjL
    template_code=SMS_150736580
    mobile=182XXXXX

     四、在src/main/java下创建包,包下有三个类,springBoot启动类(Application),sms短信监听类(SmsListener),smsUtil真正发短信工具类(SmsUtil)

     内容如下

    Application.java

    package com.dengfeng.sms;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    SmsListener.java

    package com.dengfeng.sms;
    
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    
    import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
    import com.aliyuncs.exceptions.ClientException;
    
    @Component
    public class SmsListener {
        
        @Autowired
        private SmsUtil smsUtil;
    
        @JmsListener(destination="sms")
        public void sendSms(Map<String,String> map){
            
            try {
                SendSmsResponse response = smsUtil.sendSms(map.get("mobile"),
                        map.get("template_code") ,
                        map.get("sign_name")  , 
                        map.get("param") );
                System.out.println("code:"+response.getCode());
                System.out.println("message:"+response.getMessage());
                
            
            } catch (ClientException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
    }

    SmsUtil.java

    package com.dengfeng.sms;
    
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
    import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
    import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
    import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
    import com.aliyuncs.dysmsapi.transform.v20170525.SendSmsResponseUnmarshaller;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.FormatType;
    import com.aliyuncs.http.HttpResponse;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    
    import java.nio.charset.Charset;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.UUID;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.stereotype.Component;
    
    /**
     * Created on 17/6/7.
     * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
     * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
     * 工程依赖了2个jar包(存放在工程的libs目录下)
     * 1:aliyun-java-sdk-core.jar
     * 2:aliyun-java-sdk-dysmsapi.jar
     *
     * 备注:Demo工程编码采用UTF-8
     * 国际短信发送请勿参照此DEMO
     */
    @Component
    public class SmsUtil {
    
        //产品名称:云通信短信API产品,开发者无需替换
        static final String product = "Dysmsapi";
        //产品域名,开发者无需替换
        static final String domain = "dysmsapi.aliyuncs.com";
    
        // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    
        @Autowired
        private Environment env;
        
        
        //static final String accessKeyId = "LTAIac4p8qHNx5x2";
        //static final String accessKeySecret = "";
    
        public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException {
    
            String accessKeyId=env.getProperty("accessKeyId");
            String accessKeySecret=env.getProperty("accessKeySecret");
            
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
    
            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(sign_name);
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(template_code);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            //request.setTemplateParam(param);
            request.setTemplateParam("{"name":"Tom", "code":"123"}");
            
    
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
    
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.setOutId("yourOutId");
    
            //hint 此处可能会抛出异常,注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
    
            return sendSmsResponse;
        }
    
    
        public  QuerySendDetailsResponse querySendDetails(String mobile,String bizId) throws ClientException {
    
            String accessKeyId=env.getProperty("accessKeyId");
            String accessKeySecret=env.getProperty("accessKeySecret");
            
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
    
            //组装请求对象
            QuerySendDetailsRequest request = new QuerySendDetailsRequest();
            //必填-号码
            request.setPhoneNumber(mobile);
            //可选-流水号
            request.setBizId(bizId);
            //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
            SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
            request.setSendDate(ft.format(new Date()));
            //必填-页大小
            request.setPageSize(10L);
            //必填-当前页码从1开始计数
            request.setCurrentPage(1L);
    
            //hint 此处可能会抛出异常,注意catch
            QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
    
            return querySendDetailsResponse;
        }
    
        
        /*
        public static void main(String[] args) throws ClientException, InterruptedException {
    
            //发短信
            SendSmsResponse response = sendSms();
            System.out.println("短信接口返回的数据----------------");
            System.out.println("Code=" + response.getCode());
            System.out.println("Message=" + response.getMessage());
            System.out.println("RequestId=" + response.getRequestId());
            System.out.println("BizId=" + response.getBizId());
    
            Thread.sleep(3000L);
    
            //查明细
            if(response.getCode() != null && response.getCode().equals("OK")) {
                QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId());
                System.out.println("短信明细查询接口返回数据----------------");
                System.out.println("Code=" + querySendDetailsResponse.getCode());
                System.out.println("Message=" + querySendDetailsResponse.getMessage());
                int i = 0;
                for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
                {
                    System.out.println("SmsSendDetailDTO["+i+"]:");
                    System.out.println("Content=" + smsSendDetailDTO.getContent());
                    System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
                    System.out.println("OutId=" + smsSendDetailDTO.getOutId());
                    System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
                    System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
                    System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
                    System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
                    System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
                }
                System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
                System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
            }
    
        }*/
    }

    五,创建另外一个maven项目,springboot_demo,创建方法和上面一样

    创好后pom.xml内容如下

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.dengfeng</groupId>
      <artifactId>springboot_demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.0.RELEASE</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            
            <!-- 热部署 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
            
            <!-- activemq相关 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-activemq</artifactId>
            </dependency>
            
        </dependencies>
      
          <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.7</java.version> <!--指定项目jdk版本  -->
        </properties>
    </project>

    六、在src/main/resource下创建application.properties文件

    server.port=8088
    url=https://www.cnblogs.com/binghuaZhang/
    spring.activemq.broker-url=tcp://192.168.25.129:61616

    七、在src/main/java下创建包,包下有三个类,springBoot启动类(Application),队列消息发送者类(QueueController)

    Application

    package com.dengfeng.demo.controller;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    /*
     * SpringBootApplication其实就是以下三个注解的总和
    @Configuration: 用于定义一个配置类
    @EnableAutoConfiguration :Spring Boot会自动根据你jar包的依赖来自动配置项目。
    @ComponentScan: 告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。
    
    启动之后默认端口是8080
     */
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    QueueController

    package com.dengfeng.demo.controller;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsMessagingTemplate;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    /**
     * 消息生产者
     * @author Administrator
     *
     */
    @RestController
    public class QueueController {
    
        @Autowired
        private JmsMessagingTemplate jmsMessagingTemplate;
      
        
        @RequestMapping("/sendsms")
        public void sendSms(){
            Map map=new HashMap<>();
            map.put("mobile", "1820751XXXX");
            map.put("template_code", "SMS_150736580");    
            map.put("sign_name", "登风");
            map.put("param", "{"number":"102931"}");
            jmsMessagingTemplate.convertAndSend("sms",map);
        }
    
    }

    启动项目测试

    启动send-sms-message(运行Application.java的main方法即启动)

    启动springboot-demo(运行Application.java的main方法即启动)

    地址栏输入:http://localhost:8088/sendsms

    观察控制台输出

     

    随后短信也成功发送到你的手机上

  • 相关阅读:
    python 进程通信,共享变量
    使用 curl 和 xargs 命令批量删除 ES索引,并将一些不想删除的索引过滤出来
    Spark Over Yarn 发现输出到kafka报错: topic not present on metadata after x
    ES 同台机器多实例报 master not discovered or elected yet
    ES数据写入时间格式问题
    Kibana 发现数据时间不对
    python包部署到服务器上报 cannot find module error
    好久没写博客了,。。。。。
    linux 修改 elf 文件的dynamic linker 和 rpath
    linux 进程 进程组 作业 会话 控制终端
  • 原文地址:https://www.cnblogs.com/binghuaZhang/p/14276983.html
Copyright © 2020-2023  润新知