这个 推送是上个月做的, 上线之后没有问题,所以,我就把 这个整套代码 整理一哈,方便以后使用。

    首先需求是这样的:  在比赛结束后的 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 延迟推送的栗子的更多相关文章

  1. atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99

    atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99 1.1. 云推送有推送次数或频率的限制吗? 1 1.2. 推送的消息长度 1 1.3. 离线消 ...

  2. Jpush极光推送的一些心得

    在集成极光推送的时候,test完全正常.部署到服务器后只发送一条推送之后推送不继续发送.经排查: 2018-06-28 10:24:26.394 [ThreadPoolTaskExecutor-4] ...

  3. 使用JPush(极光推送)实现远程通知

    使用JPush(极光推送)实现远程通知 远程推送是APP 必备的功能, 现在第三方的 SDK 已经做的非常完备了, 在 iOS10.0出来之后, 极光推送也及时更新了他的 SDK, 今天小试了一下效果 ...

  4. Laravel 集成 JPush 极光推送指北

    我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...

  5. JPush Android 推送如何区分开发、生产环境

    我们 Android 开发者在使用极光推送时可能会发现,在通过官方控制台进行推送时.只有 iOS 区分了开发和生产环境,而 Android 则没有.但实际开发中又确实经常需要针对开发和生产环境分别来推 ...

  6. RabbitMQ 延迟队列,消息延迟推送

    目录 应用场景 消息延迟推送的实现 测试结果 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给 ...

  7. Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 下面是一些知识点介绍,后期将会带领大家进行代码实战: 一.Android实现推送方式解决方案: 1.推 ...

  8. 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)

    这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...

  9. Android JPush(极光推送)的使用教程

    首先进入官网https://www.jpush.cn/,先注册一个账号. 注册号以后,创建应用 1.点击右上角进入个人中心 2.点击创建应用 3.在创建应用界面输入自己项目的应用名和应用的包名,输入后 ...

随机推荐

  1. 第一个shell脚本 结合计划任务下载远程文件

    思路: 进入/usr/local/apache2/htdocs/ipa/  循环读取 /root/shell/wget/down.txt  每次一行,每一行直接就是一条命令,直接 $line 就可以执 ...

  2. jquery换肤

    <script src="script/jquery-2.1.0.js"></script>      <link href="style/ ...

  3. jQuery 在Table中选择input之类的东西注意事项

    jQuery 在Table中选择input之类的东西注意事项: 如果不在td标签中,是不能进行正确选择的: <table id="tblFormId"> <tr& ...

  4. MySQL数据类型--日期时间

    一.博客前言 自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是略懂略懂的.在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来 ...

  5. C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!

    说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...

  6. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  7. 如何利用jquery 实现表格数据的搜索功能

    在表格的操作中,常常会遇到通过关键字来搜索结果,这个功能用jquery的filter实现非常简单. 我以一个小例子说明: <table> <thead> <tr cols ...

  8. JS消化理解

    JS执行的时候是必须在网页里面执行,和样式表差不多,也是内嵌的样式表,嵌在网页里面或外部的! 一 嵌在网页里面怎么嵌? 如果你想在网页里面嵌脚本,你需要在网页里面打出一块区域,这块区域来写脚本,在写样 ...

  9. linux命令行模式下对FTP服务器进行文件上传下载

    参考源:点击这里查看   1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码 ...

  10. 源码(04) -- java.util.List<E>

    java.util.List<E> 源码分析(JDK1.7) --------------------------------------------------------------- ...