【问题标题】:Exchange data in real time over AJAX with multiple threads多线程通过 AJAX 实时交换数据
【发布时间】:2011-09-15 01:21:23
【问题描述】:

我正在用 JSF 2.0 开发一个应用程序,我想要一个多行文本框,用于显示从文件中实时读取(逐行)的输出数据。

所以目标是有一个页面上有一个按钮,触发后端开始读取文件,然后在文本框中显示结果。


我曾想过通过以下方式做到这一点:

让本地页面跟踪到目前为止它在文本框中检索/显示的行。

本地页面会定期使用 AJAX 轮询后端并请求已读取的任何新数据(告诉它页面到目前为止有哪些行,然后只检索新行)。

这将一直持续到整个文件被完全检索到为止。


问题是从文件中读取的 bean 方法正在运行一个阻塞的 while 循环。因此,要同时读取它正在写入的数据结构将需要使用额外的线程,对吗?我听说在 Web 应用程序中生成新线程是一个潜在的危险举动,应该使用线程池等。

任何人都可以对此有所了解吗?


更新:我尝试了几种不同的方法,但都没有成功。但是我确实设法通过生成一个单独的Thread 来运行我的阻塞循环,而当处理 AJAX 请求时,主线程可以用来读取它。有没有一个好的库可以用来做类似的事情,仍然让 JSF 对这个 Thread 进行一些生命周期控制?

【问题讨论】:

  • 您的目标是支持 EJB 的 Java EE 5 还是 6 容器?
  • 我将它部署在不支持 EJB 的 Tomcat 服务器上...我希望我可以访问 @Asynchronous 注释,但我没有

标签: java ajax jsf jsf-2 javabeans


【解决方案1】:

您是否考虑过实现 Future 接口(包含在 Java5+ 并发 API 中)?基本上,当您在文件中阅读时,您可以将其拆分为多个部分并简单地创建一个新的 Future 对象(为每个部分)。然后,您可以在计算完成后返回对象。

通过这种方式,您可以避免在结构仍在被循环操作时访问该结构,并且您还可以将操作拆分为更小的计算,从而减少发生锁定的时间(总锁定时间可能会更长,但您可以更快地响应别的地方)。如果您保持创建 Future 对象的顺序,那么您不需要跟踪行#。请注意,调用 Future.get() 会阻塞,直到对象“准备好”。

其他人的方法将是类似的 - 进行 Ajax 调用以从 FIFO 队列中获取所有“就绪”Future 对象的内容。

我想我了解您想要完成的工作。也许更多信息会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 2014-08-15
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多