QiWe开放平台 · 个人名片
API驱动企微自动化,让开发更高效
核心能力:为开发者提供标准化接口、快速集成工具,助力产品高效拓展功能场景
团队定位:专注企微API生态的技术服务团队
对接通道:搜「QiWe 开放平台」联系客服
核心理念:合规赋能,让企微开发更简单、更高效3
为了不让提醒显得生硬,我们通常需要三个阶段的推送:开课前 1 小时(预热)、开课前 10 分钟(入场)、开课时(出发)。
1. 核心设计思路
-
任务定义 :每个课程是一个
Job,包含直播间 URL、主题和开课时间。 -
阶梯调度 :不使用简单的
Thread.sleep,而是利用 Quartz 或 Spring Task 动态计算执行时间点。 -
消息差异化:每个时间点的卡片文案和背景图动态变化,提升紧迫感。
2. Quartz 动态任务实现
首先,定义一个通用的群发 Job 类:
java
public class CourseNotifyJob implements Job {
@Override
public void execute(JobExecutionContext context) {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String courseTitle = dataMap.getString("title");
String liveUrl = dataMap.getString("url");
String stage = dataMap.getString("stage"); // "1h", "10m", "now"
// 调用之前封装的企微推送工具类
QyWxPushUtils.sendTemplateCard(
courseTitle,
buildContentByStage(stage),
liveUrl
);
}
private String buildContentByStage(String stage) {
switch (stage) {
case "1h": return "📢 还有1小时开课,建议先收藏直播间!";
case "10m": return "🔥 准备就绪!讲师已上线,点击即刻入场。";
default: return "🚀 技术盛宴已开启,速来参与互动!";
}
}
}
3. 动态计算并注册任务
当后台录入一个新课程时,自动生成三个定时任务:
java
@Service
public class SchedulerService {
@Autowired
private Scheduler scheduler;
public void scheduleCourseNotify(Course entity) {
long startTime = entity.getStartTime().getTime();
// 注册 1小时 提醒
registerJob(entity, startTime - 3600000, "1h");
// 注册 10分钟 提醒
registerJob(entity, startTime - 600000, "10m");
// 注册 即刻 提醒
registerJob(entity, startTime, "now");
}
private void registerJob(Course course, long triggerTime, String stage) {
if (triggerTime < System.currentTimeMillis()) return;
JobDetail jobDetail = JobBuilder.newJob(CourseNotifyJob.class)
.withIdentity(course.getId() + "_" + stage, "CourseGroup")
.usingJobData("title", course.getTitle())
.usingJobData("url", course.getUrl())
.usingJobData("stage", stage)
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.startAt(new Date(triggerTime))
.withSchedule(SimpleScheduleBuilder.simpleSchedule())
.build();
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
4. 关键避坑与性能点
-
时钟漂移与精度 :Quartz 默认配置下精度很高,但在高并发下,如果大量 Job 同时触发,建议给每个 Job 随机加上 10-30 秒的偏移量,防止瞬间压垮企微 API。
-
任务持久化 :如果服务器重启,内存中的 Job 就会丢失。生产环境务必配置
JobStoreTX(数据库持久化),确保提醒任务万无一失。 -
取消机制 :如果课程临时取消或改期,必须通过
scheduler.deleteJob联动清理已注册的任务。
5. 进阶:动态图片生成
为了让倒计时更直观,有些高级玩法是利用 Java 的 Graphics2D 生成一张带有"倒计时数字"的动态封面图,上传到企微临时素材后再发送,视觉效果极佳。