真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在springboot中實現(xiàn)消息推送系統(tǒng)設(shè)計

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在spring boot中實現(xiàn)消息推送系統(tǒng)設(shè)計,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計、成都網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)趙縣免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了數(shù)千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

推送系統(tǒng)作為通用的組件,存在的價值主要有以下幾點

  1. 會被多個業(yè)務(wù)項目使用,推送系統(tǒng)獨立維護可降低維護成本

  2. 推送系統(tǒng)一般都是調(diào)用三方api進(jìn)行推送,三方api一般會有調(diào)用頻率/次數(shù)限制,被推送的消息需要走隊列來合理調(diào)用三方api,控制調(diào)用的頻率和次數(shù)

  3. 業(yè)務(wù)無關(guān),一般推送系統(tǒng)設(shè)計成不需要關(guān)心業(yè)務(wù)邏輯

核心技術(shù)

  • 消息隊列

  • 三方服務(wù)api調(diào)用

    • 安卓app推送

    • 蘋果app推送

    • 微信小程序推送

    • 郵件推送

    • 釘釘推送

    • 短信推送

消息隊列選用阿里云提供的rocketmq,官方文檔:https://help.aliyun.com/document_detail/55385.html

推送時序圖

怎么在spring boot中實現(xiàn)消息推送系統(tǒng)設(shè)計

右鍵新窗口打開可以查看高清大圖

可以看到消息推送系統(tǒng)接入的第三方服務(wù)比較多,三方推送的質(zhì)量很難統(tǒng)一,就需要考慮消息的推送的重試了

思路流程

為了控制并發(fā),所有的推送都先發(fā)到rocketmq隊列里,每次推送的個數(shù)通過控制隊列的消費的客戶端的數(shù)量來實現(xiàn)

安卓和蘋果都可以使用信鴿的推送服務(wù)

怎么在spring boot中實現(xiàn)消息推送系統(tǒng)設(shè)計

信鴿推送需要客戶端進(jìn)行集成,客戶端sdk參考: https://xg.qq.com/xg/ctr_index/download

目前信鴿個人開發(fā)者仍然是可以申請的,賬號建立后,創(chuàng)建andorid和ios項目

怎么在spring boot中實現(xiàn)消息推送系統(tǒng)設(shè)計

記錄下這里的 APP ID和SECRET KEY,服務(wù)端進(jìn)行推送時需要這兩個參數(shù)

推送異常處理,推送異常時,需要重試,重試可以利用消息隊列本身的重試機制,也可以自行實現(xiàn)重試邏輯

安卓app推送

官方文檔: https://xg.qq.com/docs/android_access/jcenter.html

代碼庫: https://github.com/xingePush/xinge-api-java



  com.github.xingePush
  xinge
  1.2.1

核心代碼如下

Map messagePayload = new HashMap(1);
messagePayload.put("user_id", 1);
messagePayload.put("msg_title", "消息標(biāo)題");
messagePayload.put("msg_content", "消息內(nèi)容");
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(1));
JSONObject response = xinge.pushSingleDevice("用戶的PushToken", message);
if (response.getInt(RET_CODE) != 0) {
  // 推送異常了,進(jìn)行日志記錄等
}

蘋果app推送

使用pushy庫進(jìn)行推送



  com.turo
  pushy
  0.13.3
Map aps = new HashMap(1);
aps.put("alert", "推送內(nèi)容");
aps.put("sound", "default");
aps.put("badge", 1);

Map data = new HashMap(1);
data.put("msgTitle", "推送標(biāo)題");
data.put("msgContent", "推送內(nèi)容");
data.put("msgType", "1");
data.put("userId", "13288888888");
data.put("data", Lists.newHashMap("order_id", 1));

Map messagePayload = new HashMap(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>
    sendNotificationFuture = apnsClient.sendNotification(pushNotification);

final PushNotificationResponse 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());
  }
}

使用信鴿庫進(jìn)行推送

當(dāng)然也可以使用信鴿提供的ios推送,邏輯和安卓app的推送差不多

ios的信鴿客戶端可以和android的客戶端共用,不需要引入新的jar包了

JSONObject messagePayload = new JSONObject();
Map custom = new HashMap();

messagePayload.put("title", "推送標(biāo)題");
messagePayload.put("body", "推送內(nèi)容");

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) {
  // 推送異常了
}

釘釘推送

public static boolean send(String content, String title, Set 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請求就可以請求了

郵件推送

發(fā)送郵件可以使用java的javax.mail庫,smtp協(xié)議發(fā)送郵件


  javax.mail
  mail
  1.4.7

示例代碼參考: EmailSender.java

短信推送

短信服務(wù)商眾多,郵件一般有統(tǒng)一的smtp協(xié)議可以使用,短信沒有協(xié)議,但是一般使用http發(fā)送短信 比如以下的短信服務(wù)商

253云通訊:zz.253.com/api_doc/kai…

短信服務(wù)- 又拍云: https://www.upyun.com/products/sms

消息&短信_MSGSMS_云通信_短信- 華為云: https://www.huaweicloud.com/product/msgsms.html

消息隊列的特性

消息隊列消費異常后會自動進(jìn)行重試

一些注意的點

微信小程序每次支付可以生成一個推送碼,需要保存到數(shù)據(jù)庫或者緩存里,并且每個碼只能推送3條消息

因為消息隊列的消費在消息量大的時候具有一定的延時,這就為取消消息推送提供了可能,可以為每條消息生成一個唯一的uuid,取消的時候把這個uuid設(shè)計進(jìn)redis里,推送時檢查這個uuid是否在redis里決定推送與否

雖然推送存在不可控制的異常,比如三方推送服務(wù)出現(xiàn)了異常,但是也存在調(diào)用方傳遞參數(shù)異常,可以推送接口調(diào)用的返回值判斷是否調(diào)用推送系統(tǒng)成功,也可以記錄到日志里,這樣在調(diào)查異常原因時就比較容易

上述就是小編為大家分享的怎么在spring boot中實現(xiàn)消息推送系統(tǒng)設(shè)計了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享標(biāo)題:怎么在springboot中實現(xiàn)消息推送系統(tǒng)設(shè)計
轉(zhuǎn)載來于:http://weahome.cn/article/jsogoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部