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

时间:2011-06-14 20:57:41

标签: java ajax jsf jsf-2 javabeans

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

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


我曾考虑过以下方式:

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

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

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


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

有人可以对此有所了解吗?


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

1 个答案:

答案 0 :(得分:1)

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

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

你们其余的方法是相似的 - 进行Ajax调用,从FIFO队列中获取所有“准备好”的Future对象的内容。

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