如何在 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,因此它不会以一场史诗般的灾难告终。
我想自动更新表格以显示线程的当前状态。在这种情况下我可以使用任何预构建组件吗?
您基本上是在寻找一种称为“轮询”或“推送”的技术。轮询的基本概念是使用 javascript 的 setInterval()
或 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 组件中监控异步/后台线程状态并获取通知的主要内容,如果未能解决你的问题,请参考以下文章
当保存在后台异步完成时,我应该如何保证从嵌套上下文中的不同线程获取结果是最新的?