Flush Agent无法清除代理ClientLib路径问题(AEM 6.3环境)
我来帮你梳理下这个问题的核心和解决方案——你遇到的本质是Dispatcher的缓存失效机制默认绑定JCR原始路径,但allowProxy把ClientLib映射到了/etc.clientlibs下的代理路径,导致JCR里/apps/myapp/clientlibs下的内容更新时,Dispatcher没关联到代理路径的缓存,所以不会自动清除。结合你已经在用VersionedClientlibs的情况,给你几个针对性的解决办法:
1. 调整Dispatcher缓存失效规则,关联代理路径与原始JCR路径
在Dispatcher的配置文件dispatcher.any中,修改invalidate区块,添加规则让Dispatcher知道/etc.clientlibs/myapp/clientlibs/*的缓存对应/apps/myapp/clientlibs/*的JCR内容,这样当原始路径内容更新时,自动清除代理路径的缓存。
示例配置:
/invalidate { /0001 { /glob "*/etc.clientlibs/myapp/clientlibs/*" /type "allow" /path "/apps/myapp/clientlibs/*" } }
这个规则的作用是:当AEM发布实例发送/apps/myapp/clientlibs/*的失效请求时,Dispatcher会同时清除/etc.clientlibs/myapp/clientlibs/*路径下的所有缓存文件。
2. 配置AEM发布实例的自定义缓存失效器
如果Dispatcher的全局规则不够灵活,你可以在AEM发布实例上配置自定义的Cache Invalidator,当/apps/myapp/clientlibs下的ClientLib内容被激活时,主动发送针对/etc.clientlibs/myapp/clientlibs/clientlib.css的失效请求到Dispatcher。
具体步骤:
- 在AEM中创建一个OSGi配置,类型为
com.day.cq.replication.impl.AgentConfig(针对发布代理) - 添加
Invalidation Paths配置项,填入/etc.clientlibs/myapp/clientlibs/clientlib.css - 确保该配置关联到你的发布代理,这样每次
/apps/myapp/clientlibs下的内容发布时,都会触发这个路径的缓存失效
3. 结合VersionedClientlibs优化缓存失效逻辑
既然你已经在用VersionedClientlibs,其实可以让它的版本号机制和Dispatcher缓存更好地配合:
- 确保VersionedClientlibs正确生成带版本哈希的ClientLib URL(比如
/etc.clientlibs/myapp/clientlibs/clientlib.<hash>.css) - 在Dispatcher配置中,针对带版本号的ClientLib路径设置永久缓存,因为新版本的URL会自动替换旧版本,旧缓存不会被访问到,无需手动清除
- 如果需要彻底清除旧版本缓存,可以在发布流程中添加一个步骤,自动删除Dispatcher缓存目录下旧版本的ClientLib文件(比如通过脚本匹配旧哈希值的文件)
最后提醒你,修改Dispatcher配置后需要重启Dispatcher服务生效,同时要验证发布流程中失效请求是否正常发送到Dispatcher(可以通过Dispatcher的日志文件检查)。
内容的提问来源于stack exchange,提问作者Saravana Prakash

