我们的应用程序从旧系统导入二进制文件(主要是PDF),并将它们与一些元数据一起存储在页面上。
如果有更改,页面会自动激活。我们在复制日志和调度程序中看到复制事件,并记录了invalidate事件。但是没有驱逐条目,旧的二进制文件仍然被缓存。
我们在二进制文件的这些容器页面旁边也有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节点正下方名为“download”的节点中。它的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页面,但不在二进制文件中刷新。为了测试,我们添加了允许* .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还是来自激活的页面?
答案 0 :(得分:2)
调度程序刷新的问题似乎是文件服务的路径在使用jcr%3acontent
时使用_jcr_content
。
Dispatcher flushing删除正在刷新的路径下的文件夹_jcr_content
。它不会删除jcr%3acontent
(urldecoded as 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
然后,当刷新此路径时,它将删除刷新路径下的子目录_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
答案 1 :(得分:0)
不确定这是否是根本原因,但我怀疑你可能需要做的是去localhost:4503 / etc / replication / agents.publish.html(注意,这是一个发布实例,你可以在作者上进行并复制复制代理等,但为了POC的目的,只需直接在发布者上进行。)
然后转到您的调度员清除代理,然后单击编辑设置。
转到触发器面板。
确保选中“On Receive”触发器。这样做是为了启用链复制,这意味着当直接资产被发布时,它会直接从调度程序中删除,导致下一个请求失败,从而从调度程序中提取新的副本。
请注意,这种刷新与统计文件级别刷新不同,后者仅刷新目录,而不是资产的完全限定路径。
顺便说一下,它不是stats文件级别。如果已注释掉,则默认情况下的统计信息文件级别为0,这会使下面的任何内容无效。您似乎正在寻找的是主动删除缓存。这是可能的,因为Dave刚刚向我概述了这篇文章中一个不相关的问题: Is it possible to recursively flush directories in the CQ5/AEM apache dispatcher?
一种方法是创建一个刷新拦截器。基本上是发布者的自定义servlet。然后你要做的是配置普通的flush replicator来调用发布者的本地servlet。
然后,servlet会检测是否需要删除目录或其中的任何特定文件。它可以将刷新路径转换为所需的路径,而不是FLUSH操作,使用DELETE操作。
将刷新发送到正常的调度程序位置仍然非常重要。
希望这有帮助。