SharePoint 2016 自定义Timer Job未在Job Definition中显示问题咨询
现象说明
包含5个Timer Job类的场解决方案每次修改代码重新部署后,随机1个Job不在Job Definition中显示,1个月后自动恢复;新建解决方案的Timer Job部署后也无法显示,相关截图如下:
- 作业列表截图:

- Job Definition截图:

触发原因
- 注册逻辑冲突:Timer Job注册时未清理旧实例,重复注册导致WSS_Config数据库中Job记录冲突,系统随机将冲突记录标记为隐藏失效。1个月为SharePoint场配置缓存的默认自动清理周期,到期后失效记录被清理,Job自动恢复显示。
- 缓存同步失败:场中多台服务器的SPTimerV4服务缓存不一致,新部署的Job元数据未同步到所有服务器,导致Job加载失败不显示。
- Feature上下文错误:注册Timer Job的Feature作用域配置错误,或激活事件中未指定正确的SPFarm/SPWebApplication上下文,导致Job未关联到正确的父级对象,被系统判定为无效。
- 程序集部署异常:解决方案程序集未正确部署到所有场服务器的GAC,或新旧版本程序集共存,Job加载时找不到对应程序集而不显示。
排查解决路径
第一步:修复Timer Job注册逻辑
每个Timer Job必须使用唯一GUID作为ID,注册前先查询是否存在同名/同ID的旧Job,存在则先删除再注册,参考代码:public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPWebApplication webApp = properties.Feature.Parent as SPWebApplication; string jobName = "CustomTimerJob_01"; // 清理旧Job var oldJob = webApp.JobDefinitions.FirstOrDefault(j => j.Name == jobName); if (oldJob != null) { oldJob.Delete(); } // 注册新Job CustomTimerJob newJob = new CustomTimerJob(jobName, webApp); SPMinuteSchedule schedule = new SPMinuteSchedule(); schedule.BeginSecond = 0; schedule.EndSecond = 59; schedule.Interval = 15; newJob.Schedule = schedule; newJob.Update(); }第二步:清理场配置缓存
在所有场服务器上执行以下操作:- 停止
SPTimerV4服务 - 运行SharePoint命令行管理程序,执行
Clear-SPConfigCache命令清空配置缓存 - 重启
SPTimerV4服务,等待5分钟后检查Job是否恢复显示
- 停止
第三步:验证程序集部署状态
检查所有场服务器的GAC路径C:\Windows\Microsoft.NET\assembly\GAC_MSIL,确认解决方案对应的程序集版本一致,不存在旧版本残留,如有残留手动删除后重新部署解决方案。第四步:检查配置数据库记录
备份WSS_Config数据库后,执行SQL查询查找对应Job的记录,确认Status字段值为0(正常状态),如果值为3(失效)可手动删除该记录,之后重新激活对应Feature注册Job。
应急恢复方案
无需等待1个月自动恢复,直接重新部署解决方案,部署前先卸载旧版本:
- 执行
Uninstall-SPSolution -Identity 解决方案名称.wsp -AllWebApplications - 等待卸载完成后执行
Install-SPSolution -Identity 解决方案名称.wsp -GACDeployment -AllWebApplications - 重启所有场服务器的SPTimerV4服务,Job即可恢复显示。
内容的提问来源于stack exchange,提问作者Hassan Rasool
相关产品推荐
相关产品推荐

