我遇到了一件奇怪的事情;不幸的是,像往常一样,我无法发布代码,因此我正在描述问题,以防有人可以提出可能的原因。
我有一个 xpage,其中包含自定义控件;自定义控件通过链接处理文档锁定和更改为编辑/只读模式。文档锁定是通过基于 UNID 设置 applicationScope 变量来完成的。为了使其对系统上的其他用户更加友好,我定期在页面上运行一个功能来检查文档是否被锁定,并适当更新链接/标签/工具提示(例如,如果被其他用户锁定,则“编辑" 按钮被禁用;当锁定被释放时,它会重新启用)。这是通过标准、简单的基于 dojo 的 ajax 调用来调用“xagent”来完成的。
由于某种原因,系统的行为在 45 秒到一分钟后变得不稳定。我每隔十秒左右检查一次锁定状态,因此第一次调用时不会发生这种情况。我正在显示与该文档关联的记录列表;每个记录都是重复的一行。当我第一次进入编辑模式时,控件全部按应有的方式显示,即可编辑。如果用户使用组合框更改特定值,它将通过部分刷新更新整行。当事情变得不稳定时,我注意到该行开始以只读模式刷新,这表明文档正在更改编辑模式。我唯一一次故意更改编辑模式是按下“取消”或“保存”按钮。 (锁定机制本身与编辑模式没有任何关系。)
看起来我所做的 ajax 调用确实是这个问题的根源。但我已经将 xagent 和客户端代码精简到几乎没有,而且它仍然在发生。我看不出是什么导致了这种行为。有人可以大胆猜测一下吗?谢谢....
也许检查服务器日志文件是否有警告,例如:
警告 CLFAD####W:状态数据不可用于 /page,因为在缓存中未找到控制树。
如果您看到这些警告,则可能是服务器无法再在缓存中找到当前的 XPage 页面实例。在这种情况下,页面将恢复到初始状态,就像页面首次打开时一样。这可能就是文档进入只读模式的原因。
当 xsp.persistence.mode=basic 时,服务器端页面实例的会话缓存仅保存 4 个页面,或者当 xsp.persistence.mode=file 或 fileex 时保存 16 个实例。
如果您加载 4 个 xagent 页面实例,那么这将填满缓存,并且它将无法再找到您正在查看的当前 XPage 的页面实例。因此,XPage 将停止执行服务器端操作,并且部分刷新将始终显示页面该区域的初始状态。
为了避免这个问题,在 xagent 页面中,您可以在 xp:view 标记上设置 viewState="nostate",这样就不会为 xagent 页面保存页面实例,如下所述:https://tobysamples.wordpress.com/2014/12/11/no-state-no-problem/
或者,您可以为 xagent 创建并重用一个页面实例,因此只创建一个。也就是说,在第一次调用 XAgent 时,让 xagent 返回 xagent 页面实例的 $$viewid 值 (#{javascript:view.getUniqueViewId()}),然后在对 xagent 的后续请求中使用该 $$请求中的 viewid,以恢复现有的 xagent 页面实例,而不是创建将填充缓存的新实例。所以后续的xagent请求将是这样的:
/myApp.nsf/xagent1.xsp?$$viewid=!aaaaaaaa!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)