QiWe开放平台 · 个人名片API驱动企微自动化让开发更高效核心能力为开发者提供标准化接口、快速集成工具助力产品高效拓展功能场景官方站点https://www.qiweapi.com团队定位专注企微API生态的技术服务团队对接通道搜「QiWe 开放平台」联系客服核心理念合规赋能让企微开发更简单、更高效3为了不让提醒显得生硬我们通常需要三个阶段的推送开课前 1 小时预热、开课前 10 分钟入场、开课时出发。1. 核心设计思路任务定义每个课程是一个Job包含直播间 URL、主题和开课时间。阶梯调度不使用简单的Thread.sleep而是利用 Quartz 或 Spring Task 动态计算执行时间点。消息差异化每个时间点的卡片文案和背景图动态变化提升紧迫感。2. Quartz 动态任务实现首先定义一个通用的群发 Job 类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. 动态计算并注册任务当后台录入一个新课程时自动生成三个定时任务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生成一张带有“倒计时数字”的动态封面图上传到企微临时素材后再发送视觉效果极佳。