如何在 JSF 组件中监控异步/后台线程状态并获取通知

Posted

技术标签:

【中文标题】如何在 JSF 组件中监控异步/后台线程状态并获取通知【英文标题】:How to monitor asynchronous/background thread status and get notifications in a JSF component 【发布时间】:2012-12-02 12:48:40 【问题描述】:

我在 Web 应用程序中创建了几个线程,并且在 JSF 页面中有一个数据表组件。

我想自动更新表格以显示线程的当前状态。在这种情况下我可以使用任何预构建组件吗?

【问题讨论】:

将您的代码放入 code sample 【参考方案1】:

我在 Web 应用程序中创建了几个线程

我衷心希望你did it the right way,因此它不会以一场史诗般的灾难告终。


我想自动更新表格以显示线程的当前状态。在这种情况下我可以使用任何预构建组件吗?

您基本上是在寻找一种称为“轮询”或“推送”的技术。轮询的基本概念是使用 javascriptsetInterval()setTimeout() 每隔一段时间向服务器发出 (ajax) HTTP 请求,并让它相应地处理结果。推送的基本概念是打开一个持久的 HTTP 连接并让服务器通过它发送小消息,这可以通过 WebSocket in JavaScript 和 JSR356 API in Java EE 7 等来完成。

标准的 JSF 实现不提供任何即用型轮询或开箱即用的组件。对于即将发布的 JSF 2.3,新的 <f:websocket> 标记目前正在进行中(另请参阅 issue 1396)。

您最好的选择是带有隐藏命令链接/按钮的隐藏表单,带有<f:ajax>,然后通过setInterval() 调用它。像PrimeFaces 这样的组件库提供了开箱即用的组件,另请参阅<p:poll> showcase 和<p:push> showcase 以获得一些具体示例。 JSF 实用程序库OmniFaces 在其<o:commandScript> showcase 中有一个投票示例,在<o:socket> showcase 中有几个推送示例(新标准JSF <f:websocket> 将主要基于<o:socket>)。

另见:

How do I ajax-update a component at an interval of 1 second? Real time updates from database using JSF/Java EE How can server push asynchronous changes to a html page created by JSF?

【讨论】:

以上是关于如何在 JSF 组件中监控异步/后台线程状态并获取通知的主要内容,如果未能解决你的问题,请参考以下文章

当保存在后台异步完成时,我应该如何保证从嵌套上下文中的不同线程获取结果是最新的?

后台工作人员中异步等待中的调解员死锁-如何检测线程调用自身

如果异步方法是单线程的,它如何在后台运行?

JSF 自定义组件:如何获取 <f:ajax /> 的属性

如何在Android开发中用AsyncTask异步更新UI界面

为啥 JSF 将 UI 组件的状态保存在服务器上?