JAVA实现多线程处理批量发送短信、APP推送

时间:2021-09-10 21:12:38
/**
* 推送消息 APP、短信
* @param message
* @throws Exception
*/
public void sendMsg(Message message) throws Exception{
try {
logger.info("send message start...");
long startTime = System.currentTimeMillis();
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(20000);
ThreadPoolExecutor executors = new ThreadPoolExecutor(5, 6, 60000, TimeUnit.SECONDS, queue);

//要推送的用户总数
int count = filterPhonesCount(message);
logger.info("message all count=>{}",count);
//初始每个线程处理的用户数量
final int eveLength = 2000;
//计算处理所有用户需要的线程数量
int eveBlocks = count / eveLength + (count % eveLength != 0 ? 1 : 0);
logger.info("need thread's count=>{}",eveBlocks);
//线程计数器
CountDownLatch doneSignal = new CountDownLatch(eveBlocks);

//开启线程处理
int doneCount = 0;
for (int page = 0; page < eveBlocks; page++) { /* blocks太大可以再细分重新调度 */
MessageSendThread ms = new MessageSendThread(messageDao,message,page + 1,eveLength,doneSignal);
executors.execute(ms);
//logger.info("start thread =>{}",page+1);
doneCount++;
}
doneSignal.await();//等待所有计数器线程执行完
long endTime = System.currentTimeMillis();
logger.info("send message all thread ends!time(s)=>{}",(startTime-endTime)/1000);
logger.info("all thread count=>{}",doneCount);
} catch (Exception e) {
logger.error("send message error=>{}",e);
}
}

  

package com.bankhui.center.business.service.message;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.impl.cookie.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.bankhui.center.business.dao.message.MessageDao;
import com.bankhui.center.business.entity.message.Message;
import com.bankhui.center.common.utils.DateUtil;
import com.bankhui.center.common.utils.SmsUtils;
import com.bankhui.center.jpush.JPushClient;
import com.bankhui.center.jpush.JPushScheduleClient;

/**
* 系统消息推送线程(处理 block数据块)
*/
public class MessageSendThread implements Runnable{

private final Logger logger = LoggerFactory.getLogger(MessageSendThread.class);

private Integer currentIndex;//当前索引
private Integer rows;//处理数据条数
private CountDownLatch doneSignal;//处理线程条数
private Message message;//消息实体
private MessageDao messageDao;//DAO

public MessageSendThread(MessageDao messageDao,Message message,Integer currentIndex,Integer rows, CountDownLatch doneSignal) {
this.message = message;
this.messageDao = messageDao;
this.currentIndex = currentIndex;
this.rows = rows;
this.doneSignal = doneSignal;
}


@Override
public void run() {
try {
/**
* ---------1.查询当前的block范围内的发送的手机号=>筛选目标客户群手机号---------
*/
Map<String,Object> smsDataMap = filterPhones(message,currentIndex,rows);
if(MapUtils.isEmpty(smsDataMap)|| null == smsDataMap.get("jgAlias")
||StringUtils.isBlank(smsDataMap.get("jgAlias").toString())){
logger.debug("push param is null,caurse by target customers is nothing");
throw new RuntimeException();
}
logger.info("type of target customers=>{}", message.getReceiverGroupType());
logger.info(" result of filter target customers=>{}", smsDataMap);

/**
* ---------2.批量发送消息---------
* TODO://((-?)\d{1,11}\,?){1,n} n个线程分批发送
*/
if("0".equals(message.getType())){//短信发送
sendBatch(smsDataMap.get("phone").toString(),message);
}
if("1".equals(message.getType())){//APP推送
if("0".equals(message.getMethod())){//实时发送
sendNormal(smsDataMap);
}
if("1".equals(message.getMethod())){//定时发送
sendDelay(smsDataMap);
}
}
} catch (Exception e) {
logger.error("send message thread exception=>{}{}{}{}",message,currentIndex,rows,e);
}finally{
doneSignal.countDown();//工人完成工作,计数器减一
}
}

/**
* APP实时推送
* @param smsDataMap
*/
private void sendNormal(Map<String,Object> smsDataMap) {
//0为全部发送
if("0".equals(message.getReceiverGroupType())){
JPushClient.appSendAll(message.getTitle(), message.getContent(), message.getId().toString(), StringUtils.isBlank(message.getLink())?"0":"1", message.getLink());
}else{
String[] jgAlias = smsDataMap.get("jgAlias").toString().split(",");
for(String jgAlia:jgAlias){
JPushClient.appSend(message.getTitle(), message.getContent(), jgAlia, message.getId().toString(), StringUtils.isBlank(message.getLink())?"0":"1", message.getLink());
}
}
}

/**
* APP定时推送
* @param smsDataMap
*/
private void sendDelay(Map<String,Object> smsDataMap) {
//0为全部发送
if("0".equals(message.getReceiverGroupType())){
JPushScheduleClient.createSingleSchedule(
DateUtil.formatDateToStr("yyyy-MM-dd HH:mm:ss", message.getExpectTime()),
message.getTitle(),
message.getContent(),
message.getId().toString(),
StringUtils.isBlank(message.getLink())?"0":"1",
message.getLink());
}else{
String[] jgAlias = smsDataMap.get("jgAlias").toString().split(",");
JPushScheduleClient.createSingleSchedule(
Arrays.asList(jgAlias),
DateUtil.formatDateToStr("yyyy-MM-dd HH:mm:ss", message.getExpectTime()),
message.getTitle(),
message.getContent(),
message.getId().toString(),
StringUtils.isBlank(message.getLink())?"0":"1",
message.getLink());
}
}




/**
* 批量发送消息
* @param smsDataList
* @param message
*/
private void sendBatch(String smsDataListStr,Message message){
try {
//批量发送方法使用异步发送
if(!message.getContent().contains("退订回T")){
message.setContent(message.getContent()+"退订回T");
}
SmsUtils.batchExecuteTask(smsDataListStr, message.getContent());
//短信测试方法
//SmsUtils.batchExecuteTask(smsDataListStr, message.getContent(),true);
} catch (Exception e) {
e.printStackTrace();
logger.error("批量发送消息异常=>{}{}",smsDataListStr,e);
}
}


}
 1 /**
2 * 批量发送消息
3 * @param smsDataList
4 * @param message
5 */
6 private void sendBatch(String smsDataListStr,Message message){
7 try {
8 //批量发送方法使用异步发送
9 if(!message.getContent().contains("退订回T")){
10 message.setContent(message.getContent()+"退订回T");
11 }
12 SmsUtils.batchExecuteTask(smsDataListStr, message.getContent());
13 //短信测试方法
14 //SmsUtils.batchExecuteTask(smsDataListStr, message.getContent(),true);
15 } catch (Exception e) {
16 e.printStackTrace();
17 logger.error("批量发送消息异常=>{}{}",smsDataListStr,e);
18 }
19 }
 1 public static String sendSmsCL(String mobile, String content,String urlStr,String un, String pw, String rd) {
2 // 创建StringBuffer对象用来操作字符串
3 StringBuffer sb = new StringBuffer(urlStr+"?");
4 // 用户账号
5 sb.append("un="+un);
6
7 //用户密码
8 sb.append("&pw="+pw);
9
10 // 是否需要状态报告,0表示不需要,1表示需要
11 sb.append("&rd="+rd);
12
13 // 向StringBuffer追加手机号码
14 sb.append("&phone="+mobile);
15
16 // 返回发送结果
17 String inputline;
18 BufferedReader in = null;
19 InputStreamReader isr = null;
20 try {
21 // 向StringBuffer追加消息内容转URL标准码
22 sb.append("&msg="+URLEncoder.encode(content,"UTF8"));
23 // 创建url对象
24 URL url = new URL(sb.toString());
25
26 // 打开url连接
27 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
28
29 // 设置url请求方式 ‘get’ 或者 ‘post’
30 connection.setRequestMethod("POST");
31 isr = new InputStreamReader(url.openStream());
32 // 发送
33 in = new BufferedReader(isr);
34 inputline = in.readLine();
35 if(inputline.contains(",0")){
36 logger.info("手机号:【{}】发送短信成功", mobile);
37 }else{
38 logger.info("手机号:【{}】发送短信失败,errorMsg is:{}", mobile,inputline);
39 }
40 // 输出结果
41 return inputline;
42 } catch (Exception e) {
43 logger.error("发送短信请求异常:{}", e.getMessage());
44 return e.getMessage();
45 } finally{
46 if(null != isr){
47 try {
48 isr.close();
49 } catch (IOException e) {
50 logger.error("关闭流异常:{}", e.getMessage());
51 }
52 }
53 if(null != in){
54 try {
55 in.close();
56 } catch (IOException e) {
57 logger.error("关闭流异常:{}", e.getMessage());
58 }
59 }
60 }
61
62 }
package com.bankhui.center.jpush;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* The entrance of JPush API library.
*
*/
public class JPushClient extends BaseClient {
private static Logger logger = LoggerFactory.getLogger(JPushClient.class);
//在极光注册上传应用的 appKey 和 masterSecret
private static final String appKeyStr ="******************";////必填,

private static final String masterSecretStr = "******************";//必填,每个应用都对应一个masterSecret

private static JPushClient jpush = null;

/*
* 保存离线的时长。秒为单位。最多支持10天(864000秒)。
* 0 表示该消息不保存离线。即:用户在线马上发出,当前不在线用户将不会收到此消息。
* 此参数不设置则表示默认,默认为保存1天的离线消息(86400秒
*/
private static long timeToLive = 60 * 60 * 24;

protected static HttpPostClient httpClient = new HttpPostClient();

/**
* 给指定用户推送消息
*
@param msgTitle 标题
*
@param msgContent 内容
*
@param jgAlias 极光通讯id
*
@param sysMsgId 系统保存的消息id
*
@param type 跳转类型0不带链接跳转,1带链接跳转 2 站内信
*
@param url 跳转url
*
@author wxz
* @date 2017年2月27日
*/
public static void appSend(String msgTitle,String msgContent,String jgAlias,String sysMsgId,String type,String url) {
try {
Map
<String, Object> extra1 =new HashMap<String, Object>();
extra1.put(
"sysMsgId", sysMsgId);
extra1.put(
"type", type);//0不带链接跳转,1带链接跳转
extra1.put("url", url);
if(null == jpush){
jpush
= new JPushClient(masterSecretStr, appKeyStr, timeToLive);
}
MessageResult msgResult
= jpush.sendNotificationWithAlias(getRandomSendNo(), jgAlias, msgTitle, msgContent, 0, extra1);

if (null != msgResult) {
logger.info(
"服务器返回数据: " + msgResult.toString());
if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) {
logger.info(
"发送成功, sendNo=" + msgResult.getSendno());
}
else {
logger.error(
"发送失败, 错误代码=" + msgResult.getErrcode() + ", 错误消息=" + msgResult.getErrmsg());
}
}
else {
logger.error(
"无法获取数据");
}
}
catch (Exception e) {
logger.error(
"发送失败,error msg is :"+e);
}
}
/**
* 给所有用户推送消息
*
@param msgTitle 标题
*
@param msgContent 内容
*
@param sysMsgId 消息id
*
@param type 跳转类型0不带链接跳转,1带链接跳转
*
@param url 跳转url
*
@author wxz
* @date 2017年2月27日
*/
public static void appSendAll(String msgTitle,String msgContent,String sysMsgId,String type,String url) {
/*
* IOS设备扩展参数,
* 设置badge,设置声音
*/

Map
<String, Object> extra1 =new HashMap<String, Object>();
extra1.put(
"sysMsgId", sysMsgId);
extra1.put(
"type", type);//0不带链接跳转,1带链接跳转
extra1.put("url", url);
if(null == jpush){
jpush
= new JPushClient(masterSecretStr, appKeyStr, timeToLive);
}
MessageResult msgResult
= jpush.sendNotificationWithAppKey(getRandomSendNo(), msgTitle, msgContent, 0, extra1);

if (null != msgResult) {
logger.info(
"服务器返回数据: " + msgResult.toString());
if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) {
logger.info(
"发送成功, sendNo=" + msgResult.getSendno());
}
else {
logger.error(
"发送失败, 错误代码=" + msgResult.getErrcode() + ", 错误消息=" + msgResult.getErrmsg());
}
}
else {
logger.error(
"无法获取数据");
}


}

public JPushClient(String masterSecret, String appKey) {
this.masterSecret = masterSecret;
this.appKey = appKey;
}

public JPushClient(String masterSecret, String appKey, long timeToLive) {
this.masterSecret = masterSecret;
this.appKey = appKey;
this.timeToLive = timeToLive;
}

public JPushClient(String masterSecret, String appKey, DeviceEnum device) {
this.masterSecret = masterSecret;
this.appKey = appKey;
devices.add(device);
}

public JPushClient(String masterSecret, String appKey, long timeToLive, DeviceEnum device) {
this.masterSecret = masterSecret;
this.appKey = appKey;
this.timeToLive = timeToLive;
devices.add(device);
}

/*
* @description 发送带IMEI的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithImei(String sendNo, String imei, String msgTitle, String msgContent) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.IMEI);
p.setReceiverValue(imei);
return sendNotification(p, sendNo, msgTitle, msgContent, 0, null);
}

/*
* @params builderId通知栏样式
* @description 发送带IMEI的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithImei(String sendNo, String imei, String msgTitle, String msgContent, int builderId, Map<String, Object> extra) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.IMEI);
p.setReceiverValue(imei);
return sendNotification(p, sendNo, msgTitle, msgContent, builderId, extra);
}

/*
* @description 发送带IMEI的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithImei(String sendNo, String imei, String msgTitle, String msgContent) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.IMEI);
p.setReceiverValue(imei);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, null, null);
}

/*
* @params msgContentType消息的类型,extra附属JSON信息
* @description 发送带IMEI的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithImei(String sendNo, String imei, String msgTitle, String msgContent, String msgContentType, Map<String, Object> extra) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.IMEI);
p.setReceiverValue(imei);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, msgContentType, extra);
}

/*
* @description 发送带TAG的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithTag(String sendNo, String tag, String msgTitle, String msgContent) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.TAG);
p.setReceiverValue(tag);
return sendNotification(p, sendNo, msgTitle, msgContent, 0, null);
}

/*
* @params builderId通知栏样式
* @description 发送带TAG的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithTag(String sendNo, String tag, String msgTitle, String msgContent, int builderId, Map<String, Object> extra) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.TAG);
p.setReceiverValue(tag);
return sendNotification(p, sendNo, msgTitle, msgContent, builderId, extra);
}

/*
* @description 发送带TAG的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithTag(String sendNo, String tag, String msgTitle, String msgContent) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.TAG);
p.setReceiverValue(tag);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, null, null);
}

/*
* @params msgContentType消息的类型,extra附属JSON信息
* @description 发送带TAG的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithTag(String sendNo, String tag, String msgTitle, String msgContent, String msgContentType, Map<String, Object> extra) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.TAG);
p.setReceiverValue(tag);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, msgContentType, extra);
}

/*
* @description 发送带ALIAS的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithAlias(String sendNo, String alias, String msgTitle, String msgContent) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.ALIAS);
p.setReceiverValue(alias);
return sendNotification(p, sendNo, msgTitle, msgContent, 0, null);
}

/*
* @params builderId通知栏样式
* @description 发送带ALIAS的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithAlias(String sendNo, String alias, String msgTitle, String msgContent, int builderId, Map<String, Object> extra) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.ALIAS);
p.setReceiverValue(alias);
return sendNotification(p, sendNo, msgTitle, msgContent, builderId, extra);
}

/*
* @description 发送带ALIAS的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithAlias(String sendNo, String alias, String msgTitle, String msgContent) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.ALIAS);
p.setReceiverValue(alias);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, null, null);
}

/*
* @params msgContentType消息的类型,extra附属JSON信息
* @description 发送带ALIAS的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithAlias(String sendNo, String alias, String msgTitle, String msgContent, String msgContentType, Map<String, Object> extra) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.ALIAS);
p.setReceiverValue(alias);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, msgContentType, extra);
}

/*
* @description 发送带AppKey的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithAppKey(String sendNo, String msgTitle, String msgContent) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.APPKEYS);
return sendNotification(p, sendNo, msgTitle, msgContent, 0, null);
}

/*
* @params builderId通知栏样式
* @description 发送带AppKey的通知
* @return MessageResult
*/
public MessageResult sendNotificationWithAppKey(String sendNo, String msgTitle, String msgContent, int builderId, Map<String, Object> extra) {
NotifyMessageParams p
= new NotifyMessageParams();
p.setReceiverType(ReceiverTypeEnum.APPKEYS);
return sendNotification(p, sendNo, msgTitle, msgContent, builderId, extra);
}

/*
* @description 发送带AppKey的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithAppKey(String sendNo, String msgTitle, String msgContent) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.APPKEYS);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, null, null);
}

/*
* @params msgContentType消息的类型,extra附属JSON信息
* @description 发送带AppKey的自定义消息
* @return MessageResult
*/
public MessageResult sendCustomMessageWithAppKey(String sendNo, String msgTitle, String msgContent, String msgContentType, Map<String, Object> extra) {
CustomMessageParams p
= new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.APPKEYS);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, msgContentType, extra);
}

protected MessageResult sendCustomMessage(CustomMessageParams p, String sendNo, String msgTitle, String msgContent, String msgContentType, Map<String, Object> extra) {
if (null != msgContentType) {
p.getMsgContent().setContentType(msgContentType);
}
if (null != extra) {
p.getMsgContent().setExtra(extra);
}
return sendMessage(p, sendNo, msgTitle, msgContent);
}

protected MessageResult sendNotification(NotifyMessageParams p, String sendNo, String msgTitle, String msgContent, int builderId, Map<String, Object> extra) {
p.getMsgContent().setBuilderId(builderId);
if (null != extra) {
p.getMsgContent().setExtra(extra);
}
return sendMessage(p, sendNo, msgTitle, msgContent);
}

protected MessageResult sendMessage(MessageParams p,String sendNo, String msgTitle, String msgContent) {
p.setSendNo(sendNo);
p.setAppKey(
this.getAppKey());
p.setMasterSecret(
this.masterSecret);
p.setTimeToLive(
this.timeToLive);
p.setSendDescription(
this.getSendDescription());
for (DeviceEnum device : this.getDevices()) {
p.addPlatform(device);
}

if (null != msgTitle) {
p.getMsgContent().setTitle(msgTitle);
}
p.getMsgContent().setMessage(msgContent);

return sendMessage(p);
}

protected MessageResult sendMessage(MessageParams params) {
return httpClient.post(BaseURL.ALL_PATH, this.enableSSL, params);
}


public static final int MAX = Integer.MAX_VALUE;
public static final int MIN = (int) MAX/2;

/**
* 保持 sendNo 的唯一性是有必要的
* It is very important to keep sendNo unique.
*
@return sendNo
*/
public static String getRandomSendNo() {
return String.valueOf((int) (MIN + Math.random() * (MAX - MIN)));
}
}
  1 package com.bankhui.center.jpush;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import org.apache.shiro.util.CollectionUtils;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11
12 import cn.jpush.api.JPushClient;
13 import cn.jpush.api.common.TimeUnit;
14 import cn.jpush.api.common.Week;
15 import cn.jpush.api.common.resp.APIConnectionException;
16 import cn.jpush.api.common.resp.APIRequestException;
17 import cn.jpush.api.push.model.Platform;
18 import cn.jpush.api.push.model.PushPayload;
19 import cn.jpush.api.push.model.audience.Audience;
20 import cn.jpush.api.schedule.ScheduleListResult;
21 import cn.jpush.api.schedule.ScheduleResult;
22 import cn.jpush.api.schedule.model.SchedulePayload;
23 import cn.jpush.api.schedule.model.TriggerPayload;
24
25 public class JPushScheduleClient {
26
27 protected static final Logger LOG = LoggerFactory.getLogger(JPushScheduleClient.class);
28
29 private static final String appKey ="*********";
30 private static final String masterSecret = "*******";
31 /*
32 * 保存离线的时长。秒为单位。最多支持10天(864000秒)。
33 * 0 表示该消息不保存离线。即:用户在线马上发出,当前不在线用户将不会收到此消息。
34 * 此参数不设置则表示默认,默认为保存1天的离线消息(86400秒
35 */
36 private static int timeToLive = 60 * 60 * 24;
37
38 public static void main(String[] args) {
39 List<String> list = new ArrayList<String>();
40 list.add("22");
41 // testGetScheduleList();
42 // testUpdateSchedule();
43 String scheduleId = "***************";
44 String time = "2017-03-07 09:55:00";
45 String msgTitle = "push schedule jpush,TEST\"\"";
46 String msgContent = "测试定时发送";
47 String sysMsgId = "26";
48 String type = "1";
49 String url = "https://www.baidu.com";
50 //指定接收者的定时发送
51 scheduleId = createSingleSchedule(list,time,msgTitle,msgContent,sysMsgId,type,url);
52 //全部用户的定时发送
53 // scheduleId = createSingleSchedule(time,msgTitle,msgContent,sysMsgId,type,url);
54 testGetSchedule(scheduleId);
55 // testDeleteSchedule(scheduleId);
56 }
57 /**
58 * 添加指定接收者定时发送消息的
59 * @param aliases List<String> 接收者极光id列表
60 * @param time 定时发送时间(yyyy-MM-dd HH:mm:ss)
61 * @param msgTitle 标题
62 * @param msgContent 内容
63 * @param sysMsgId 系统保存的消息id
64 * @param type 跳转类型0不带链接跳转,1带链接跳转
65 * @param url 跳转url
66 * @return
67 * @author wxz
68 * @date 2017年3月7日
69 */
70 public static String createSingleSchedule(List<String> aliases,
71 String time, String msgTitle, String msgContent,
72 String sysMsgId, String type, String url) {
73 if(CollectionUtils.isEmpty(aliases)){
74 LOG.info("aliases is empty");
75 return null;
76 }
77 JPushClient jpushClient = new JPushClient(masterSecret, appKey, timeToLive);
78 String name = "schedule_"+time.replaceAll(" ", "").replaceAll(":", "").replaceAll("-", "");
79 Map<String, String> extra = new HashMap<String, String>();
80 extra.put("sysMsgId", sysMsgId);
81 extra.put("type", type);//0不带链接跳转,1带链接跳转
82 extra.put("url", url);
83
84 // Message message = new cn.jpush.api.push.model.Message.Builder()
85 // .setMsgContent(msgContent).addExtras(extra)
86 // .build();
87 // Audience audience = new cn.jpush.api.push.model.audience.Audience.Builder().build().alias(aliases);
88 //初始化android消息通知
89 cn.jpush.api.push.model.notification.AndroidNotification androidNotification = new cn.jpush.api.push.model.notification.AndroidNotification.Builder().setAlert(msgContent).setTitle(msgTitle).addExtras(extra).build();
90 //初始化ios消息通知
91 cn.jpush.api.push.model.notification.IosNotification iosNotification = new cn.jpush.api.push.model.notification.IosNotification.Builder().setAlert(msgContent).addExtras(extra).build();
92 //初始化消息通知,将android和ios赋值
93 cn.jpush.api.push.model.notification.Notification notification = new cn.jpush.api.push.model.notification.Notification.Builder()
94 .addPlatformNotification(androidNotification)
95 .addPlatformNotification(iosNotification)
96 .build();
97 //初始化push
98 PushPayload push = new cn.jpush.api.push.model.PushPayload.Builder()
99 .setPlatform(Platform.all())
100 .setAudience(Audience.alias(aliases))
101 .setNotification(notification)
102 .build();
103 // PushPayload pucsh = PushPayload.alertAll("----test schedule example0000001111111.");
104 try {
105 ScheduleResult result = jpushClient.createSingleSchedule(name, time, push);
106 LOG.info("schedule result is " + result);
107 return result.getSchedule_id();
108 } catch (APIConnectionException e) {
109 LOG.error("Connection error. Should retry later. ", e);
110 } catch (APIRequestException e) {
111 LOG.error("Error response from JPush server. Should review and fix it. ", e);
112 LOG.info("HTTP Status: " + e.getStatus());
113 LOG.info("Error Code: " + e.getErrorCode());
114 LOG.info("Error Message: " + e.getErrorMessage());
115 }
116 return null;
117 }
118 /**
119 * 添加所有用户定时发送消息的
120 * @param time 定时发送时间(yyyy-MM-dd HH:mm:ss)
121 * @param msgTitle 标题
122 * @param msgContent 内容
123 * @param sysMsgId 系统保存的消息id
124 * @param type 跳转类型0不带链接跳转,1带链接跳转
125 * @param url 跳转url
126 * @return
127 * @author wxz
128 * @date 2017年3月7日
129 */
130 public static String createSingleSchedule(String time, String msgTitle,
131 String msgContent, String sysMsgId, String type, String url) {
132 JPushClient jpushClient = new JPushClient(masterSecret, appKey, timeToLive);
133 String name = "schedule_"+time.replaceAll(" ", "").replaceAll(":", "").replaceAll("-", "");
134 Map<String, String> extra = new HashMap<String, String>();
135 extra.put("sysMsgId", sysMsgId);
136 extra.put("type", type);//0不带链接跳转,1带链接跳转
137 extra.put("url", url);
138
139 // Message message = new cn.jpush.api.push.model.Message.Builder()
140 // .setMsgContent(msgContent).addExtras(extra)
141 // .build();
142 // PushPayload push = new cn.jpush.api.push.model.PushPayload.Builder().setPlatform(Platform.all())
143 // .setAudience(Audience.all())
144 // .setMessage(message)
145 //// .setOptions(new cn.jpush.api.push.model.Options.Builder().setApnsProduction(true).build())
146 // .build();
147 //初始化android消息通知
148 cn.jpush.api.push.model.notification.AndroidNotification androidNotification = new cn.jpush.api.push.model.notification.AndroidNotification.Builder().setAlert(msgContent).setTitle(msgTitle).addExtras(extra).build();
149 //初始化ios消息通知
150 cn.jpush.api.push.model.notification.IosNotification iosNotification = new cn.jpush.api.push.model.notification.IosNotification.Builder().setAlert(msgContent).addExtras(extra).build();
151 //初始化消息通知,将android和ios赋值
152 cn.jpush.api.push.model.notification.Notification notification = new cn.jpush.api.push.model.notification.Notification.Builder()
153 .addPlatformNotification(androidNotification)
154 .addPlatformNotification(iosNotification)
155 .build();
156 //初始化push
157 PushPayload push = new cn.jpush.api.push.model.PushPayload.Builder()
158 .setPlatform(Platform.all())
159 .setAudience(Audience.all())
160 .setNotification(notification)
161 .build();
162 // PushPayload push = new cn.jpush.api.push.model.PushPayload.Builder()
163 // .setPlatform(Platform.all())
164 // .setAudience(Audience.all())
165 // .setNotification(new cn.jpush.api.push.model.notification.Notification.Builder().addPlatformNotification(new cn.jpush.api.push.model.notification.AndroidNotification.Builder().setAlert(msgContent).setTitle(msgTitle).addExtras(extra).build())
166 // .addPlatformNotification(new cn.jpush.api.push.model.notification.IosNotification.Builder().setAlert(msgContent).addExtras(extra).build())
167 // .build())
168 // .build();
169 // PushPayload pucsh = PushPayload.alertAll("----test schedule example0000001111111.");
170 try {
171 ScheduleResult result = jpushClient.createSingleSchedule(name, time, push);
172 LOG.info("schedule result is " + result);
173 return result.getSchedule_id();
174 } catch (APIConnectionException e) {
175 LOG.error("Connection error. Should retry later. ", e);
176 } catch (APIRequestException e) {
177 LOG.error("Error response from JPush server. Should review and fix it. ", e);
178 LOG.info("HTTP Status: " + e.getStatus());
179 LOG.info("Error Code: " + e.getErrorCode());
180 LOG.info("Error Message: " + e.getErrorMessage());
181 }
182 return null;
183 }
184
185 private static void testCreateDailySchedule() {
186 JPushClient jPushClient = new JPushClient(masterSecret, appKey);
187 String name = "test_daily_schedule";
188 String start = "2015-08-06 12:16:13";
189 String end = "2115-08-06 12:16:13";
190 String time = "14:00:00";
191 PushPayload push = PushPayload.alertAll("test daily example.");
192 try {
193 ScheduleResult result = jPushClient.createDailySchedule(name, start, end, time, push);
194 LOG.info("schedule result is " + result);
195 } catch (APIConnectionException e) {
196 LOG.error("Connection error. Should retry later. ", e);
197 } catch (APIRequestException e) {
198 LOG.error("Error response from JPush server. Should review and fix it. ", e);
199 LOG.info("HTTP Status: " + e.getStatus());
200 LOG.info("Error Code: " + e.getErrorCode());
201 LOG.info("Error Message: " + e.getErrorMessage());
202 }
203 }
204
205 private static void testCreateWeeklySchedule() {
206 JPushClient jPushClient = new JPushClient(masterSecret, appKey);
207 String name = "test_weekly_schedule";
208 String start = "2015-08-06 12:16:13";
209 String end = "2115-08-06 12:16:13";
210 String time = "14:00:00";
211 Week[] days = {Week.MON, Week.FRI};
212 PushPayload push = PushPayload.alertAll("test weekly example.");
213 try {
214 ScheduleResult result = jPushClient.createWeeklySchedule(name, start, end, time, days, push);
215 LOG.info("schedule result is " + result);
216 } catch (APIConnectionException e) {
217 LOG.error("Connection error. Should retry later. ", e);
218 } catch (APIRequestException e) {
219 LOG.error("Error response from JPush server. Should review and fix it. ", e);
220 LOG.info("HTTP Status: " + e.getStatus());
221 LOG.info("Error Code: " + e.getErrorCode());
222 LOG.info("Error Message: " + e.getErrorMessage());
223 }
224 }
225
226 private static void testCreateMonthlySchedule() {
227 JPushClient jPushClient = new JPushClient(masterSecret, appKey);
228 String name = "test_monthly_schedule";
229 String start = "2015-08-06 12:16:13";
230 String end = "2115-08-06 12:16:13";
231 String time = "14:00:00";
232 String[] points = {"01", "02"};
233 PushPayload push = PushPayload.alertAll("test monthly example.");
234 try {
235 ScheduleResult result = jPushClient.createMonthlySchedule(name, start, end, time, points, push);
236 LOG.info("schedule result is " + result);
237 } catch (APIConnectionException e) {
238 LOG.error("Connection error. Should retry later.", e);
239 } catch (APIRequestException e) {
240 LOG.error("Error response from JPush server. Should review and fix it. ", e);
241 LOG.info("HTTP Status: " + e.getStatus());
242 LOG.info("Error Code: " + e.getErrorCode());
243 LOG.info("Error Message: " + e.getErrorMessage());
244 }
245 }
246
247 private static void testDeleteSchedule(String scheduleId) {
248 // String scheduleId = "************************8";
249 JPushClient jpushClient = new JPushClient(masterSecret, appKey);
250
251 try {
252 jpushClient.deleteSchedule(scheduleId);
253 } catch (APIConnectionException e) {
254 LOG.error("Connection error. Should retry later. ", e);
255 } catch (APIRequestException e) {
256 LOG.error("Error response from JPush server. Should review and fix it. ", e);
257 LOG.info("HTTP Status: " + e.getStatus());
258 LOG.info("Error Code: " + e.getErrorCode());
259 LOG.info("Error Message: " + e.getErrorMessage());
260 }
261 }
262
263 private static void testGetScheduleList() {
264 int page = 1;
265 JPushClient jpushClient = new JPushClient(masterSecret, appKey);
266
267 try {
268 ScheduleListResult list = jpushClient.getScheduleList(page);
269 LOG.info("total " + list.getTotal_count());
270 for(ScheduleResult s : list.getSchedules()) {
271 LOG.info(s.toString());
272 }
273 } catch (APIConnectionException e) {
274 LOG.error("Connection error. Should retry later. ", e);
275 } catch (APIRequestException e) {
276 LOG.error("Error response from JPush server. Should review and fix it. ", e);
277 LOG.info("HTTP Status: " + e.getStatus());
278 LOG.info("Error Code: " + e.getErrorCode());
279 LOG.info("Error Message: " + e.getErrorMessage());
280 }
281 }
282
283 private static void testUpdateSchedule() {
284 String scheduleId = "*******************";
285 JPushClient jpushClient = new JPushClient(masterSecret, appKey);
286 String[] points = {Week.MON.name(), Week.FRI.name()};
287 TriggerPayload trigger = TriggerPayload.newBuilder()
288 .setPeriodTime("2015-08-01 12:10:00", "2015-08-30 12:12:12", "15:00:00")
289 .setTimeFrequency(TimeUnit.WEEK, 2, points)
290 .buildPeriodical();
291 SchedulePayload payload = SchedulePayload.newBuilder()
292 .setName("test_update_schedule")
293 .setEnabled(false)
294 .setTrigger(trigger)
295 .build();
296 try {
297 jpushClient.updateSchedule(scheduleId, payload);
298 } catch (APIConnectionException e) {
299 LOG.error("Connection error. Should retry later. ", e);
300 } catch (APIRequestException e) {
301 LOG.error("Error response from JPush server. Should review and fix it. ", e);
302 LOG.info("HTTP Status: " + e.getStatus());
303 LOG.info("Error Code: " + e.getErrorCode());
304 LOG.info("Error Message: " + e.getErrorMessage());
305 }
306 }
307
308 private static void testGetSchedule(String scheduleId) {
309 // String scheduleId = "************************";
310 JPushClient jpushClient = new JPushClient(masterSecret, appKey);
311
312 try {
313 ScheduleResult result = jpushClient.getSchedule(scheduleId);
314 LOG.info("schedule " + result);
315 } catch (APIConnectionException e) {
316 LOG.error("Connection error. Should retry later. ", e);
317 } catch (APIRequestException e) {
318 LOG.error("Error response from JPush server. Should review and fix it. ", e);
319 LOG.info("HTTP Status: " + e.getStatus());
320 LOG.info("Error Code: " + e.getErrorCode());
321 LOG.info("Error Message: " + e.getErrorMessage());
322 }
323 }
324
325 /**
326 * 组建push,若发送全部,则aliases传null
327 * @param aliases List<String> 接收者极光id列表
328 * @param msgTitle 标题
329 * @param msgContent 内容
330 * @param sysMsgId 系统保存的消息id
331 * @param type 跳转类型0不带链接跳转,1带链接跳转
332 * @param url 跳转url
333 * @return
334 * @author wxz
335 * @date 2017年3月7日
336 */
337 private static PushPayload buildPush(List<String> aliases,String msgTitle, String msgContent,
338 String sysMsgId, String type, String url) {
339 Map<String, String> extra = new HashMap<String, String>();
340 extra.put("sysMsgId", sysMsgId);
341 extra.put("type", type);//0不带链接跳转,1带链接跳转
342 extra.put("url", url);
343 //初始化android消息通知
344 cn.jpush.api.push.model.notification.AndroidNotification androidNotification = new cn.jpush.api.push.model.notification.AndroidNotification.Builder().setAlert(msgContent).setTitle(msgTitle).addExtras(extra).build();
345 //初始化ios消息通知
346 cn.jpush.api.push.model.notification.IosNotification iosNotification = new cn.jpush.api.push.model.notification.IosNotification.Builder().setAlert(msgContent).addExtras(extra).build();
347 //初始化消息通知,将android和ios赋值
348 cn.jpush.api.push.model.notification.Notification notification = new cn.jpush.api.push.model.notification.Notification.Builder()
349 .addPlatformNotification(androidNotification)
350 .addPlatformNotification(iosNotification)
351 .build();
352 //初始化push
353 PushPayload push = new cn.jpush.api.push.model.PushPayload.Builder()
354 .setPlatform(Platform.all())
355 .setAudience(CollectionUtils.isEmpty(aliases)?Audience.all():Audience.alias(aliases))
356 .setNotification(notification)
357 .build();
358 return push;
359 }
360 }