1

单击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>
4

0 回答 0