时间:2021-05-19
推送系统作为通用的组件,存在的价值主要有以下几点
核心技术
消息队列选用阿里云提供的rocketmq,官方文档:https://help.aliyun.com/document_detail/55385.html
推送时序图
右键新窗口打开可以查看高清大图
可以看到消息推送系统接入的第三方服务比较多,三方推送的质量很难统一,就需要考虑消息的推送的重试了
思路流程
为了控制并发,所有的推送都先发到rocketmq队列里,每次推送的个数通过控制队列的消费的客户端的数量来实现
安卓和苹果都可以使用信鸽的推送服务
信鸽推送需要客户端进行集成,客户端sdk参考: https://xg.qq.com/xg/ctr_index/download
目前信鸽个人开发者仍然是可以申请的,账号建立后,创建andorid和ios项目
记录下这里的 APP ID和SECRET KEY,服务端进行推送时需要这两个参数
推送异常处理,推送异常时,需要重试,重试可以利用消息队列本身的重试机制,也可以自行实现重试逻辑
安卓app推送
官方文档: https://xg.qq.com/docs/android_access/jcenter.html
代码库: https://github.com/xingePush/xinge-api-java
<!-- 信鸽推送客户端 --><dependency> <groupId>com.github.xingePush</groupId> <artifactId>xinge</artifactId> <version>1.2.1</version></dependency>核心代码如下
Map<String, Object> messagePayload = new HashMap<String, Object>(1);messagePayload.put("user_id", 1);messagePayload.put("msg_title", "消息标题");messagePayload.put("msg_content", "消息内容");messagePayload.put("msg_type", 1);messagePayload.put("data", Lists.newHashMap("order_id", 1));XingeApp xinge = new XingeApp(androidAccessId, androidSecretKey);MessageAndroid message = new MessageAndroid();ClickAction action = new ClickAction();action.setActionType(ClickAction.TYPE_ACTIVITY);message.setAction(action);message.setContent(JsonUtil.toJsonString(messagePayload));message.setType(MessageAndroid.TYPE_MESSAGE);message.setExpireTime(86400);message.setCustom(new HashMap<String, Object>(1));JSONObject response = xinge.pushSingleDevice("用户的PushToken", message);if (response.getInt(RET_CODE) != 0) { // 推送异常了,进行日志记录等}苹果app推送
使用pushy库进行推送
<!-- IOS推送客户端 --><dependency> <groupId>com.turo</groupId> <artifactId>pushy</artifactId> <version>0.13.3</version></dependency>Map<String, Object> aps = new HashMap<String, Object>(1);aps.put("alert", "推送内容");aps.put("sound", "default");aps.put("badge", 1);Map<String, Object> data = new HashMap<String, Object>(1);data.put("msgTitle", "推送标题");data.put("msgContent", "推送内容");data.put("msgType", "1");data.put("userId", "13288888888");data.put("data", Lists.newHashMap("order_id", 1));Map<String, Object> messagePayload = new HashMap<String, Object>(1);messagePayload.put("aps", aps);messagePayload.put("data", data);ApnsClient apnsClient = new ApnsClientBuilder() .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST) .setClientCredentials(this.getClass().getClassLoader().getResourceAsStream("推送证书相对resources目录的路径"), "") .build();String payload = JsonUtil.toJsonString(messagePayload);String token = TokenUtil.sanitizeTokenString("app用户的pushToken");SimpleApnsPushNotification pushNotification = new SimpleApnsPushNotification(token, "com.suxiaolin.app1", payload);PushNotificationFuture<SimpleApnsPushNotification, PushNotificationResponse<SimpleApnsPushNotification>> sendNotificationFuture = apnsClient.sendNotification(pushNotification);final PushNotificationResponse<SimpleApnsPushNotification> pushNotificationResponse = sendNotificationFuture.get();if (pushNotificationResponse.isAccepted()) { System.out.println("Push notification accepted by APNs gateway.");} else { System.out.println("Notification rejected by the APNs gateway: " + pushNotificationResponse.getRejectionReason()); if (pushNotificationResponse.getTokenInvalidationTimestamp() != null) { System.out.println("\t…and the token is invalid as of " + pushNotificationResponse.getTokenInvalidationTimestamp()); }}使用信鸽库进行推送
当然也可以使用信鸽提供的ios推送,逻辑和安卓app的推送差不多
ios的信鸽客户端可以和android的客户端共用,不需要引入新的jar包了
JSONObject messagePayload = new JSONObject();Map<String, Object> custom = new HashMap<String, Object>();messagePayload.put("title", "推送标题");messagePayload.put("body", "推送内容");messagePayload.put("user_id", 1);messagePayload.put("msg_type", 1);messagePayload.put("data", Lists.newArrayList("orderId", 1));XingeApp xinge = new XingeApp(iosAccessId, iosSecretKey);MessageIOS message = new MessageIOS();message.setType(MessageIOS.TYPE_APNS_NOTIFICATION);message.setExpireTime(86400);message.setAlert(content);message.setBadge(1);message.setCategory("INVITE_CATEGORY");message.setCustom(messagePayload);response = xinge.pushSingleDevice("app用户的pushToken", message, XingeApp.IOSENV_PROD);if (response.getInt(RET_CODE) != 0) { // 推送异常了}小程序推送
官方文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
可以看到微信小程序推送接口是普通的post请求
小程序api地址: https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send
http请求,http请求库可以参考: HttpUtil
钉钉推送
官方文档:https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq#-2 代码示例
public static boolean send(String content, String title, Set<String> receivers) { try { HttpUtil.ResponseWrap result = HttpUtil.postWrap(ddUrl, "{\n" + " \"msgtype\": \"text\",\n" + " \"text\": {\"content\":\"" + title + "\r\n" + content + "\n|" + receivers.stream().map(r -> "@" + r).collect(Collectors.joining(" ")) + "\"},\n" + " \"at\": {\n" + " \"atMobiles\": [" + receivers.stream().map(r -> "\"" + r + "\"").collect(Collectors.joining(",")) + "], \n" + " \"isAtAll\": false\n" + " }\n" + " }"); return result.getStatusCode() == 200; } catch (Exception e) { return false; }}完整代码参考DingTalkUtil.java
使用http请求就可以请求了
邮件推送
发送邮件可以使用java的javax.mail库,smtp协议发送邮件
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version></dependency>示例代码参考: EmailSender.java
短信推送
短信服务商众多,邮件一般有统一的smtp协议可以使用,短信没有协议,但是一般使用http发送短信 比如以下的短信服务商
253云通讯:zz.253.com/api_doc/kai…
短信服务- 又拍云: https:///jibaole/spring-boot-starter-alimq/pull/6/files 核心逻辑是先给消息设置一个最大消费次数和消费时长,然后当消息消费次数和消费时长达到阈值时,直接置为成功
ios使用信鸽推送时,需要上传开发证书和生产证书,这两个证书至少需要上传一个
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文介绍了springboot的maven配置依赖详解,分享给大家,具体如下:我们通过引用spring-boot-starter-parent,添加spring
导入mybatis依赖org.mybatis.spring.bootmybatis-spring-boot-starter2.0.1yml实现mybatis依赖
一)spring-boot-starter命名规则自动配置模块命名规则:xxx-spring-boot,如:aspectlog-spring-boot启动器命名
1.什么是spring-boot-devtoolsspring-boot-devtools是spring-boot项目开发时的一个热部署工具,安装了spring
1.加入mybatis-spring-boot-stater的Maven依赖org.mybatis.spring.bootmybatis-spring-boot