调用DefaultCatalogSynchronizationService同步时Cron Job报Entity not found错误
问题背景
通过代码调用DefaultCatalogSynchronizationService.synchronizeFully(source, target)执行全量目录同步时,触发的定时任务持续失败,报错如下:
ERROR [hybrisHTTP2] (0000009D) [Job] Caught throwable Entity not found ( pk = 8796096201204 name = 'de.hybris.platform.persistence.processing_Job' type code = '500' db table = 'jobs'): object no longer valid de.hybris.platform.jalo.JaloSystemException: Entity not found ( pk = 8796096201204 name = 'de.hybris.platform.persistence.processing_Job' type code = '500' db table = 'jobs'): object no longer valid[HY--1] at de.hybris.platform.catalog.jalo.synchronization.CatalogVersionSyncJob.configureFullVersionSync(CatalogVersionSyncJob.java:502) at de.hybris.platform.catalog.jalo.synchronization.CatalogVersionSyncJob.performCronJob(CatalogVersionSyncJob.java:840) at de.hybris.platform.cronjob.jalo.Job.execute(Job.java:1396) at de.hybris.platform.cronjob.jalo.Job.performImpl(Job.java:805) at de.hybris.platform.cronjob.jalo.Job.performImpl(Job.java:720) at de.hybris.platform.cronjob.jalo.Job.perform(Job.java:632) at de.hybris.platform.servicelayer.cronjob.impl.DefaultCronJobService.performCronJob(DefaultCronJobService.java:81) at de.hybris.platform.catalog.synchronization.DefaultCatalogSynchronizationService.synchronizeFully(DefaultCatalogSynchronizationService.java:74)
但通过Backoffice手动执行同步一切正常,移除产品中名为Exploded drawing的图片字段值后,代码调用的同步也能正常执行。
排查思路
检查图片字段的同步规则配置
确认Exploded drawing对应的Media类型属性在目录同步规则(CatalogVersionSyncJob的syncItems配置)中是否存在特殊处理:比如是否开启了强制同步,但关联的Media实体已被删除,导致同步时尝试引用已失效的Media处理Job;对比Backoffice手动同步的Job配置和代码自动生成的临时Job配置,看是否存在参数差异(如Media异步处理开关、关联任务配置)。验证Media实体及关联关系
查询Exploded drawing字段关联的Media实体状态:检查其在medias表中是否存在、p_state是否为正常状态;确认该Media是否关联了异步处理Job(如MediaConversionJob),若关联的Job已被删除但Media的关联字段未更新,同步时会触发实体找不到的错误。分析自动生成同步Job的生命周期
代码调用synchronizeFully会自动创建临时的CatalogVersionSyncJob和CronJob,检查这些临时Job的创建逻辑:是否在处理包含特殊Media字段的产品时,错误引用了缓存中残留的旧Job PK;对比正常(移除图片字段)和异常场景下自动生成Job的参数差异,重点关注Media相关的任务配置。排查事务与缓存问题
确认代码调用时的事务上下文是否与Backoffice不同:比如是否在事务未提交时触发同步,导致Media实体状态未持久化,同步Job尝试引用未提交的实体关联Job;清理Hybris缓存(区域缓存、查询缓存),验证是否是缓存残留了已删除的Job实体数据。追踪同步Job的配置逻辑
查看CatalogVersionSyncJob.configureFullVersionSync方法(报错栈第502行)的具体逻辑,确认处理Media字段时是否会获取关联的处理Job,且该Job已失效;启用Hybris调试日志,打印自动生成Job的所有参数和关联实体,对比正常与异常场景的差异。
内容的提问来源于stack exchange,提问作者Gothiquo

