【问题标题】:CQ/AEM Dispatcher does not flush BinariesCQ/AEM 调度程序不刷新二进制文件
【发布时间】:2026-01-10 05:25:03
【问题描述】:

我们的应用程序从旧系统导入二进制文件(主要是 PDF),并将它们与一些元数据一起存储在页面上。

如果有更改,页面会自动激活。我们在复制日志中看到复制事件,并且在调度程序上记录了一个无效事件。但是没有驱逐条目,这个旧的二进制文件仍然被缓存。

我们在这些二进制文件容器页面旁边还有 HTML 页面,它们按预期工作。这里是成功的 html 和不成功的 PDF 的两个日志条目:

好的:

[Thu Jul 03 09:26:33 2014] [D] [27635(24)] Found farm website for localhost:81 
[Thu Jul 03 09:26:33 2014] [D] [27635(24)] checking [/dispatcher/invalidate.cache] 
[Thu Jul 03 09:26:33 2014] [I] [27635(24)] Activation detected: action=Activate [/content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/test] 
[Thu Jul 03 09:26:33 2014] [I] [27635(24)] Touched /app/C2Z/dyn/c2zcqdis/docroot/.stat 
[Thu Jul 03 09:26:33 2014] [I] [27635(24)] Evicted /app/C2Z/dyn/c2zcqdis/docroot/content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/test.html 
[Thu Jul 03 09:26:33 2014] [D] [27635(24)] response.status = 200 
[Thu Jul 03 09:26:33 2014] [D] [27635(24)] response.headers[Server] = "Communique/2.6.3 (build 5221)" 
[Thu Jul 03 09:26:33 2014] [D] [27635(24)] response.headers[Content-Type] = "text/html" 
[Thu Jul 03 09:26:33 2014] [D] [27635(24)] cache flushed 
[Thu Jul 03 09:26:33 2014] [I] [27635(24)] "GET /dispatcher/invalidate.cache" 200 13 2ms

不行

[Thu Jul 03 09:30:45 2014] [D] [27635(24)] Found farm website for localhost:81 
[Thu Jul 03 09:30:45 2014] [D] [27635(24)] checking [/dispatcher/invalidate.cache] 
[Thu Jul 03 09:30:45 2014] [I] [27635(24)] Activation detected: action=Activate [/content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf] 
[Thu Jul 03 09:30:45 2014] [I] [27635(24)] Touched /app/C2Z/dyn/c2zcqdis/docroot/.stat 
[Thu Jul 03 09:30:45 2014] [D] [27635(24)] response.status = 200 
[Thu Jul 03 09:30:45 2014] [D] [27635(24)] response.headers[Server] = "Communique/2.6.3 (build 5221)" 
[Thu Jul 03 09:30:45 2014] [D] [27635(24)] response.headers[Content-Type] = "text/html" 
[Thu Jul 03 09:30:45 2014] [D] [27635(24)] cache flushed 
[Thu Jul 03 09:30:45 2014] [I] [27635(24)] "GET /dispatcher/invalidate.cache" 200 13 1ms

在这种情况下,PDF 存储在 jcr:content 节点正下方的名为“下载”的节点中。它的 html 容器永远不会直接调用,这在调度程序上不可用。所以用户直接请求文件: /content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf/jcr%3acontent/download/file.res/as2p_vvm_ch_gl_fix_chf_.pdf

在 dispatcher.any 中,我们会在激活时刷新所有 html 页面,但不会刷新二进制文件。为了测试,我们添加了一个 allow *.pdf 但这并没有帮助。

/invalidate
{
/0000
  {
  /glob "*"
  /type "deny"
  }
/0001
  {
  /glob "*.html"
  /type "allow"
  }
}

在我看来,invalidate 调用应该只删除整个文件夹: /content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf

知道为什么我们的二进制文件没有被刷新吗?

更新:在另一篇文章中提到了 dispatcher.any 中的 statfileslevel 属性。在我们的环境中,这被注释掉了。难道这可能是问题所在。可悲的是,我不完全理解这应该如何工作。该级别是来自 wwwroot 还是来自激活的页面?

【问题讨论】:

  • 感谢 Dave 的格式化,没看到可以这样格式化日志。

标签: aem dispatcher


【解决方案1】:

不确定这是否是根本原因,但我怀疑您可能需要做的是转到 localhost:4503/etc/replication/agents.publish.html(注意,这是一个发布实例,您可以在作者上执行并复制复制代理等,但出于 POC 的目的,只需直接在发布者上执行。)

然后转到您的调度程序刷新代理,然后单击编辑设置。

转到触发器面板。

确保选中“接收时”触发器。这样做是为了启用链复制,这意味着当直接资产发布时,它会直接从调度程序中删除,导致下一个请求未命中,从而从调度程序中提取一个新副本。

请注意,这种刷新不同于 stats 文件级别的刷新,后者仅刷新目录,而不是资产的完全限定路径。


顺便说一句,这不是统计文件级别。如果注释掉,则统计文件级别默认为 0,这会使下面的任何内容无效。您似乎正在寻找的是缓存的主动删除。这是可能的,因为 Dave 刚刚在这篇文章中向我概述了一个不相关的问题: Is it possible to recursively flush directories in the CQ5/AEM apache dispatcher?

一种方法是创建一个刷新拦截器。本质上是发布者上的自定义 servlet。然后,您要做的是配置正常的刷新复制器以调用发布者上的本地 servlet。

servlet 然后检测它是否需要删除目录或其中的任何特定文件。它可以将刷新路径转换为所需的路径,并且使用删除操作代替 FLUSH 操作。

将刷新发送到正常的调度程序位置仍然非常重要。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答,但“接收时”已被选中,正如我所提到的,我们这里没有 DAM 资产,而是直接附加到页面的二进制文件。当然只有页面被激活,期望在调度程序上生成的整个文件夹结构也会被驱逐,遗憾的是事实并非如此。
  • 添加了另一种方法并解释了统计文件级别。
【解决方案2】:

您的调度程序刷新问题似乎是提供文件的路径使用jcr%3acontent,而它应该使用_jcr_content

调度程序刷新删除正在刷新的路径下的文件夹_jcr_content。它不会删除jcr%3acontent(url 解码为jcr:content)。因此,您应该改为使用以下 URL 提供 pdf: /content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf/_jcr_content/download/file.res/as2p_vvm_ch_gl_fix_chf_.pdf

这会将 pdf 文件缓存在: {CACHEROOT}/content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf/_jcr_content/download/file.res/as2p_vvm_ch_gl_fix_chf_.pdf

那么当这个路径被flush的时候会删除flush路径下的子目录_jcr_content /content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf

更详细地说,当您发出上述路径的刷新请求时,会删除以下文件和目录:

  • /content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf.* 其中 * 是通配符
  • /content/offering/s2p/en/offerings/documents/Swiss_Mandate_Line/Review/as2p_vvm_ch_gl_fix_chf__pdf/_jcr_content

有关冲洗工作原理的详细信息,请参阅本演示文稿中的幻灯片 23: http://www.slideshare.net/andrewmkhoury/aem-cq-dispatcher-caching-webinar-2013

【讨论】:

  • 感谢您的意见,我会在下周尝试并告诉您是否有效。
  • 测试成功。再次感谢您的提示。
最近更新 更多