我发生了一件奇怪的事情;像往常一样,我不能发布代码,不幸的是,所以我正在描述问题,以防有人提出可能的原因。
我有一个包含自定义控件的xpage;自定义控件处理文档锁定并通过链接更改为编辑/只读模式。通过基于UNID设置applicationScope变量来完成文档锁定。为了使系统中的其他用户更友好,我在页面上定期运行一个函数来检查文档是否被锁定并适当地更新链接/标签/工具提示(例如,如果被其他用户锁定,则“编辑” “按钮被禁用;当锁定被释放时,它被重新启用)。这是通过标准的,基于dojo的简单ajax调用来调用“xagent”来完成的。
出于某种原因,系统的行为在45秒到一分钟后变得不稳定。我每十秒左右检查一次锁定状态,所以第一次通话时不会发生这种情况。我正在显示与文档关联的记录列表;每条记录都是重复的一行。当我第一次进入编辑模式时,控件全部按原样显示,即可编辑。如果用户使用组合框更改特定值,则会使用部分刷新更新整行。当事情变得不稳定时,我注意到该行在只读模式下开始刷新,这表明文档正在改变编辑模式。我故意改变编辑模式的唯一一次是按下“取消”或“保存”按钮。 (锁定机制本身与编辑模式无关。)
看起来我正在制作的ajax调用就是这个问题的根源。但我已经将xagent和客户端代码剥离到几乎没有任何东西,而且它仍在发生。我看不出会导致这种行为的原因。谁能冒险猜测?感谢....
答案 0 :(得分:4)
也许检查服务器日志文件是否包含警告:
警告CLFAD #### W:状态数据不适用于/页面,因为在缓存中找不到控制树。
如果您看到这些警告,则可能是服务器无法再在缓存中找到当前的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!
答案 1 :(得分:1)
没有代码很难排除故障,但这里有一些想法:
它不可能是随机的,关键是要确定可重现的步骤,以确定常见的场景/场景和原因。
修改强> 继您的其他信息后,编辑链接上是否有呈现的属性?如果在早期JSF生命周期阶段计算为false,则在Invoke Application阶段期间无法触发eventHandler。由于eventHandler还包含refreshId,因此没有refreshId和refreshMode,因此默认为完全刷新且没有运行SSJS 。有关说明http://www.intec.co.uk/view-isrenderingphase-and-buttons/的信息,请参阅此博客文章。