通过多线程的AJAX实时交换数据

ido*_*ize 6 java ajax jsf javabeans jsf-2

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

因此,目标是让一个页面上有一个按钮,触发后端开始从文件中读取,然后在文本框中读取结果时显示结果.


我曾考虑过以下方式做到这一点:

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

本地页面将定期使用AJAX轮询后端并请求已读取的任何新数据(告诉它到目前为止页面具有哪些行,并且从那时起仅检索新行).

这将继续,直到完整检索整个文件.


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

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


更新:我尝试了几件不同的事情,没有运气.但我确实设法通过生成一个单独Thread的运行我的阻塞循环来使它工作,而主要线程可以用来在处理AJAX请求时从它读取.有没有一个很好的库我可以用来做类似的事情仍然给JSF一些生命周期控制Thread呢?

小智 1

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

这样,您就可以避免在循环操作结构时访问该结构,并且还可以将操作拆分为较小的计算,从而减少锁定发生的时间(总锁定时间可能会更长,但您可以更快地响应其他区域) 。如果您保持 Future 对象的创建顺序,则无需跟踪行号。请注意,调用 Future.get() 会阻塞,直到对象“准备好”为止。

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

我想我明白你想要完成什么......也许更多的信息会有所帮助。