JAVA实现多线程处理批量发送短信、APP推送
/** * 推送消息 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 }