3.短信微服务
3.1需求分析
构建一个通用的短信发送服务(独立于优乐选的单独工程),接收activeMQ的消息(MAP类型) 消息包括手机号(mobile)、短信模板号(template_code)、签名(sign_name)、参数字符串(param )
3.2代码实现
3.2.1工程搭建
(1)创建单独的一个工程sms (JAR工程),POM文件引入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <!-- springmvc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--消息中间件activeMq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> <version>1.5.1.RELEASE</version> </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.2.5</version> </dependency> <!--spirngboot热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
(2)创建SpringBoot启动类
@SpringBootApplication public class SpringBootMain { public static void main(String[] args) { SpringApplication.run(SpringBootMain.class,args); } }
(3)创建配置文件application.properties
server.port=8888
spring.activemq.broker-url=tcp://192.168.200.128:61616
accessKeyId=LTAI4FvQrw3GH2kYQec4Cqkx
accessKeySecret=KUMQdNDKcAGDWYiYXBBayOmxePuFCQ
3.2.2短信工具类
参照之前的短信demo创建短信工具类
@Component public class SmsUtil { //产品名称:云通信短信API产品,开发者无需替换 static final String product = "Dysmsapi"; //产品域名:阿里大于域名 static final String domain = "dysmsapi.aliyuncs.com"; @Autowired private Environment env; //用于获取application.properties文件中的数据 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.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; } }
3.2.3消息监听类
创建SmsListener.java
@Component public class SmsListener { @Autowired private SmsUtil smsUtil; @JmsListener(destination = "smscode") public void sendSms(Map<String,Object> map){ try{ SendSmsResponse response = smsUtil.sendSms((String) map.get("mobile"), (String)map.get("template_code"),(String) map.get("sign_name"), (String)map.get("param")); }catch (Exception e){ e.printStackTrace(); } } }
3.3代码测试
创建测试controller类
@RestController public class QueueController { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @RequestMapping("/sendsms") public void sendSms(){ Map map=new HashMap(); map.put("mobile", "13513"); //发送短信的手机号 map.put("template_code", "SMS_17"); //阿里大鱼模板名称 map.put("sign_name", "品优购"); //阿里大鱼签名名称 map.put("param", "{\"code\":\"102931\"}"); //短信验证码,可以自己生产随机数 jmsMessagingTemplate.convertAndSend("sms",map); } }
启动offcn_sms
启动springboot_demo
地址栏输入:http://localhost:8888/sendmap.do
观察控制台输出
随后短信也成功发送到你的手机上