2011-06-14 12 views
6

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

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


我曾想过通过以下方式这样做:

拥有当地页跟踪哪些行已检索/到目前为止,在文本框中显示。

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

这将持续到整个文件被完全检索。


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

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


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

+0

您是否针对具有EJB支持的Java EE 5或6容器? – BalusC 2011-06-17 20:26:02

+0

我在没有EJB支持的Tomcat服务器上部署这个...我希望我可以访问@Asynchronous注释,但是我没有 – idolize 2011-06-17 21:48:31

回答

1

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

通过这种方式,您可以避免在循环操作时必须访问该结构,并且还可以将操作拆分为更小的计算,从而减少发生锁定的时间量(总锁定时间可能会更长,但您的响应速度会更快到其他地区)。如果你保持你的Future对象被创建的顺序,那么你不需要追踪第#行。请注意,调用Future.get()会阻塞,直到对象处于“就绪”状态。

其余的你的方法是类似的 - 使Ajax调用从FIFO队列中获取所有'ready'未来对象的内容。

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