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

  • 格式:pdf
  • 大小:135.02 KB
  • 文档页数:9

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 queue = new LinkedBlockingQueue(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 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 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 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(",");