jpush 延迟推送的栗子
这个 推送是上个月做的, 上线之后没有问题,所以,我就把 这个整套代码 整理一哈,方便以后使用。
首先需求是这样的: 在比赛结束后的 10 钟 开始给 参加比赛的球员 发送消息,告诉他们比赛的信息和视频都已经 整理完成了,请用户观看查询。
其实没有什么特别的内容,只是调用一下jpush的接口而已, 还要对之前的参数和接口调通之后的参数 判断分析。
// 比赛结束的推送消息
@Override
public void sendMessageForGameOver(String gameId) { ExecutorService fixedThreadPool = Executors.newFixedThreadPool(100);
fixedThreadPool.execute(new MessageForGameOver(gameId));
}
class MessageForGameOver implements Runnable {
private String gameId;
public MessageForGameOver(String gameId) {
this.gameId = gameId;
}
public void startEvent(){
try{
//获取主队的所有球员的Id
Game gameOverDto=gameService.getGameRaw(gameId);
String homeTeamId = gameOverDto.getHomeTeamId();
List<String> homeTeamUserIds = getUserIdsByTeamId(homeTeamId);
//获取客队的所有球员的Id
String guestTeamId = gameOverDto.getGuestTeamId();
List<String> guestTeamUserIds = getUserIdsByTeamId(guestTeamId);
PushMessageDto homeTeamDto = genPushMessageDtoService.genPushMessageDtoForGameOver(gameOverDto, homeTeamUserIds, gameOverDto.getGuestTeamId());
PushMessageDto guestTeamDto = genPushMessageDtoService.genPushMessageDtoForGameOver(gameOverDto, guestTeamUserIds, gameOverDto.getHomeTeamId());
PushMessage pushMessage = new PushMessage();
pushMessage.setBizid(gameId);
pushMessage.setBiztype(2);
pushMessage.setProcessStatus(2);
pushMessage.setProcessCount(0);
pushMessage.setCreatedTime(new Date());
pushMessage.setUpdatedTime(new Date());
PushMessage message = pushMessageService.insertSelective(pushMessage);
saveMessageDetailService.saveMessageDetailForGameOver(gameOverDto); // 消息内容保存到本地的
sendMessageToJpush(homeTeamDto, guestTeamDto, message); // 发送消息
}catch (Exception e){
log.error("消息发送出错"+e.getMessage());
}
}
@Override
public void run() { // 线程 启动 延迟 10 分钟
try {
Thread.sleep(10*60*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
startEvent();
}
}
private void sendMessageToJpush(PushMessageDto homeTeamDto, PushMessageDto guestTeamDto, PushMessage message) {
Boolean flag = false;
if (homeTeamDto != null) {
CallBackMessage callBackMessage = sendMessage(homeTeamDto); // 这里主要是这个方法来发送消息
if (callBackMessage.getCode() == 200) {
flag = true;
message.setProcessCount(1);
message.setProcessStatus(3);
pushMessageService.updateByPrimaryKeySelective(message);
}else {
message.setProcessCount(1);
message.setProcessStatus(4);
message.setFailureReason(callBackMessage.getErrorMessage());
pushMessageService.updateByPrimaryKeySelective(message);
}
}
if (guestTeamDto != null) {
CallBackMessage callBackMessage = sendMessage(guestTeamDto);
if (callBackMessage.getCode() == 200) {
message.setProcessCount(1);
message.setProcessStatus(3);
pushMessageService.updateByPrimaryKeySelective(message);
}else{
message.setProcessCount(1);
message.setProcessStatus(4);
message.setFailureReason(callBackMessage.getErrorMessage());
pushMessageService.updateByPrimaryKeySelective(message);
}
}
}
@Override
public CallBackMessage sendMessage(PushMessageDto pushMessageDto) { // 发送消息的地方
JPushClient jPushClient;
if ("basketball".equals(pushMessageDto.getSportType())) {
jPushClient = new JPushClient(SECRET, APP_KEY, 3); // jpush 提供的类
} else if ("football".equals(pushMessageDto.getSportType())) {
jPushClient = new JPushClient(SECRET_NEW, APP_KEY_NEW, 3);
} else {
String errMsg = "Connection error, unknown sport type, cannot choose app key. Sport type: " +
pushMessageDto.getSportType();
log.error(errMsg);
return new CallBackMessage(404, "error", errMsg);
}
PushPayload payload = buildPushObject_ios_audienceMore_messageWithExtras(pushMessageDto);
try {
if (payload != null) {
Iterator it = pushMessageDto.getUserIds().iterator();
String value = null;
while (it.hasNext()){
value = (String)it.next();
System.out.println(value);
log.info("JPush发送get用户,用户ID 为"+value);
}
PushResult result = jPushClient.sendPush(payload); // 发送到jpush
return new CallBackMessage(200, "ok", "success");
}
return new CallBackMessage(500, "error", "初始化参数失败,这些用户都没有设置过alias!");
} catch (APIConnectionException e) {
log.error("Connection error, should retry later,errorMessage:" + e.getMessage());
return new CallBackMessage(404, "error", "Connection error, should retry later,errorMessage" + e.getMessage());
} catch (APIRequestException e) {
log.error("HTTP Status: " + e.getStatus());
log.error("Error Code: " + e.getErrorCode());
log.error("Error Message: " + e.getErrorMessage());
return new CallBackMessage(e.getErrorCode(), e.getStatus() + "", e.getErrorMessage());
}
}
jpush 延迟推送的栗子的更多相关文章
- atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99
atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99 1.1. 云推送有推送次数或频率的限制吗? 1 1.2. 推送的消息长度 1 1.3. 离线消 ...
- Jpush极光推送的一些心得
在集成极光推送的时候,test完全正常.部署到服务器后只发送一条推送之后推送不继续发送.经排查: 2018-06-28 10:24:26.394 [ThreadPoolTaskExecutor-4] ...
- 使用JPush(极光推送)实现远程通知
使用JPush(极光推送)实现远程通知 远程推送是APP 必备的功能, 现在第三方的 SDK 已经做的非常完备了, 在 iOS10.0出来之后, 极光推送也及时更新了他的 SDK, 今天小试了一下效果 ...
- Laravel 集成 JPush 极光推送指北
我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...
- JPush Android 推送如何区分开发、生产环境
我们 Android 开发者在使用极光推送时可能会发现,在通过官方控制台进行推送时.只有 iOS 区分了开发和生产环境,而 Android 则没有.但实际开发中又确实经常需要针对开发和生产环境分别来推 ...
- RabbitMQ 延迟队列,消息延迟推送
目录 应用场景 消息延迟推送的实现 测试结果 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给 ...
- Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 下面是一些知识点介绍,后期将会带领大家进行代码实战: 一.Android实现推送方式解决方案: 1.推 ...
- 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)
这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...
- Android JPush(极光推送)的使用教程
首先进入官网https://www.jpush.cn/,先注册一个账号. 注册号以后,创建应用 1.点击右上角进入个人中心 2.点击创建应用 3.在创建应用界面输入自己项目的应用名和应用的包名,输入后 ...
随机推荐
- 1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
项目创建时会有 “Use Core Data" ,但是,有时没有勾选这个选项,那么就要手动链接Core Data Framework. 选中 Grocery Dude Target Gene ...
- Angular - - angular.injector、angular.module
angular.injector 创建一个injector对象, 调用injector对象的方法可用于获取服务以及依赖注入. 格式:angular.injector(modules); modules ...
- PHP cookie禁用时session 方案
在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递.这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题.我认为,出现这个问题的原因有以下几点: 1.客户端 ...
- origin从图中获得数据
有Origin的原图,即利用Origin的"copy page"功能直接拷贝到文字处理软件的数据图,对于这种图,双击用Origin打开后,双击要导出数据的权限,打开"pl ...
- Java泛型类型擦除导致的类型转换问题
初步结论:泛型类型转换不靠谱: 源码: package com.srie.testjava; public class TestClassDefine4<T> { public stati ...
- html标签大全(1)
http标签详解及讲解 1.基础标签 <!DOCTYPE html> <!--表示文本类型--> <html> <!--<html> ...
- 对于python的__name__="__main__"的含义的理解
学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main ...
- easyui帮助文档地址
http://www.jeasyui.com/documentation/index.php# http://www.jeasyui.net/tutorial/22.html http://www.j ...
- Spring集成MyBatis框架
Java在写数据库查询时,我接触过四种方式: 1.纯Java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池) 这种模式实际上性能是非常不错的,但是使用起来并不是非常方便:一是要手工为 ...
- Jenkins在windows上的安装配置
今天是2月14号,所谓西方情人节,下班回来发现,2月14过的比七夕还火热.于是上网百度百科查询了"情人节". 毕竟是中国的百度啊.是这么解释的.我感到很欣慰.过得每一个节日都应该 ...