您的位置:首页 > 移动开发 > 微信开发

quartz实现微信定时群发

2016-03-07 00:00 429 查看
摘要: 由于公司业务需要,做了微信二次开发,本文介绍几月quartz实现定时发送和取消定时群发微信消息。

定时群发主要分为两部分:定时任务和群发任务

定时任务可以通过前台传递过来的时间参数,来启动定时器,并在指定的时间,启动群发任务。

定时任务设置代码如下

/**
* 在某个时间点执行一次
* @Title SimpleRun
* @Description
* @author Administrator
* @param
* @return void
* @throws ParseException
*/
private void SimpleRun(Record record) {
//获取到前台传递过来的时间参数
String send_time = record.getStr("send_time");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

SchedulerFactory factory = new StdSchedulerFactory();
Scheduler schedule;
Date send_date = null;
int time = 0;
try {
send_date = sdf.parse(send_time);
//获取任务调度器
schedule = factory.getScheduler();
//此对象用来像job传递参数
JobDataMap dataMap = new JobDataMap();
dataMap.put("msg_record", record);
//定义job对象,并绑定自定义WXArticleSendJob类
//真正执行job的任务,并不是实现了Job接口的WXArticleSendJob类,而是通过反射的方式实例化的一个JobDetail的对象
JobDetail jobDetail = JobBuilder.newJob(WXArticleSendJob.class).withIdentity(send_time, Constants.WX_GROUP).usingJobData(dataMap).build();
//   Date start_time = DateBuilder.nextGivenSecondDate(null, 10);
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().
withIdentity("simpleTrigger", "wx_trigger_group").withDescription("定时群发微信")
/* .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10)//重复间隔
.withRepeatCount(5))//重复次数
*/    .startAt(send_date).build();

Date df = schedule.scheduleJob(jobDetail, simpleTrigger);
log.info("job id 为"+jobDetail.getKey().getName()+ "的任务,将在"+sdf.format(df)+"运行. 并且基于描述: "+simpleTrigger.getDescription());
MsgSendService service = new MsgSendService();
//群发信息入库
boolean flag = service.saveMsg(record);
schedule.start();
} catch (SchedulerException e) {
time++;
System.out.println("time --------"+time);
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
/**
* 定时群发job
* 此job的主要功能是向粉丝发送消息
* 由于微信服务器将会在群发任务即将完成的时候,就推送群发结果,此时的推送人数数据将会与实际情形存在一定误差
* @author Administrator
*
* 2015-12-10
*/
@DisallowConcurrentExecution//保存在JobDataMap传递的参数
@PersistJobDataAfterExecution//保证多个任务间不会同时执行.所以在多任务执行时最好加上
public class WXArticleSendJob implements Job{
public static final Logger log = Logger.getLogger(WXArticleSendJob.class);

@Override
public void execute(JobExecutionContext context) {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
Record msg_record =  (Record) dataMap.get("msg_record");
//token
String token = AccessTokenApi.getAccessToken().getAccessToken();
String data = processSendMsgData(msg_record);
JSONObject jsonObj = null;
int count = 0;
//像微信服务器发送群发任务,最多尝试三次
while(count < Constants.TOTAL_COUNT){
//群发
String result = HttpKit.post(Constants.SEND_MSG+token, data);
//解析群发结果
jsonObj = JSONObject.parseObject(result);
int errcode = jsonObj.getIntValue("errcode");
//说明报错了
if(0 != errcode){
count++;
log.error(jsonObj.getString("errmsg"));
}else{
break;
}
}
//说明没有请求成功
if(count == Constants.TOTAL_COUNT){
msg_record.set("errmsg", jsonObj.getString("errmsg"));
msg_record.set("type", 2);
}else{
String msg_id = jsonObj.getString("msg_id");
String msg_data_id = jsonObj.getString("msg_data_id");
msg_record.set("msg_id", msg_id);
msg_record.set("msg_data_id", msg_data_id);
}
MsgSendService service = new MsgSendService();
//群发信息入库
try {
service.updateMsg(msg_record);
} catch (ParseException e) {
e.printStackTrace();
log.error(e.getMessage());
}
// 任务执行的时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 时 mm 分 ss 秒");

String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());
String jobName = context.getJobDetail().getKey().getName();
log.info("任务"+jobName+"在"+jobRunTime+"执行了");
}
/**
*
* @Title processSendMsgData
* @Description 拼接群发需要的字符串
* @author Administrator
* @param
* @date 2016-1-27
* @return String
*/
private String processSendMsgData(Record record){
String msg_type = record.getStr("msg_type");
StringBuffer sb = new StringBuffer("{");
if("news".equalsIgnoreCase(msg_type)){
sb.append("\"filter\":").append("{").append("\"is_to_all\":").append(record.getInt("is_to_all")).append(",\"group_id\":").append(record.getInt("group_id")).append("},");
sb.append("\"mpnews\":").append("{").append("\"media_id\":\"").append(record.getStr("media_id")).append("\"").append("},");
sb.append("\"msgtype\":").append("\"mpnews\"");
}else if("voice".equalsIgnoreCase(msg_type)){
sb.append("\"filter\":").append("{").append("\"is_to_all\":").append(record.getInt("is_to_all")).append(",\"group_id\":").append(record.getInt("group_id")).append("},");
sb.append("\"voice\":").append("{").append("\"media_id\":\"").append(record.getStr("media_id")).append("\"").append("},");
sb.append("\"msgtype\":").append("\"voice\"");
}else if("text".equalsIgnoreCase(msg_type)){
sb.append("\"filter\":").append("{").append("\"is_to_all\":").append(record.getInt("is_to_all")).append(",\"group_id\":").append(record.getInt("group_id")).append("},");
sb.append("\"text\":").append("{").append("\"content\":\"").append(record.getStr("content")).append("\"").append("},");
sb.append("\"msgtype\":").append("\"text\"");
}else if("image".equalsIgnoreCase(msg_type)){
sb.append("\"filter\":").append("{").append("\"is_to_all\":").append(record.getInt("is_to_all")).append(",\"group_id\":").append(record.getInt("group_id")).append("},");
sb.append("\"image\":").append("{").append("\"media_id\":\"").append(record.getStr("media_id")).append("\"").append("},");
sb.append("\"msgtype\":").append("\"image\"");
}else if("video".equalsIgnoreCase(msg_type)){

}
sb.append("}");
return sb.toString();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息