单击updateRecords按钮时,会执行一个需要很长时间的 DB 操作。我打算向用户显示一个描述数据库操作状态的动态进度条。
我正在使用 myfaces.orchestra 的访问范围和 primefaces 的进度条。
管弦乐队应用锁定并且在myBean.updateRecords()完全执行之前不允许获取myBean.progressMonitor 。
错误是:
等待超过 30000 毫秒才能访问被线程锁定的锁 org.apache.myfaces.lib._ReentrantLock@2c93ed ..
ReentrantLock 不允许从不同线程访问 FacesContex。因此无法访问进度条模型并且部分请求被锁定,直到完整请求完成。虽然 ajax 设置为“假”。
我们如何允许与 Orchestra 的并发请求?
我还尝试创建一个线程并在该线程中执行繁重的操作。但是,我没有在那里得到 FacesContext。
相同的解决方法是什么?
示例代码片段:
<p:commandButton id="updateRecords" onclick="startProgressBar();"
async="true" ajax="false" actionListener="#{myBean.updateRecords}" />
<h:panelGrid id="progressBarPanel">
<p:progressBar id="progress" interval="10"
rendered="#{myBean.progressBarRendered}" ajax="true"
value="#{myBean.progressMonitor}"
widgetVar="pbAjax" labelTemplate="{value}%}"/>
</h:panelGrid>