我正在使用JSF 2.0开发一个应用程序,我希望有一个多行文本框,显示实时从文件中读取(逐行)的输出数据。
因此,目标是让一个页面上有一个按钮,触发后端开始从文件中读取,然后在文本框中读取结果时显示结果。
我曾考虑过以下方式:
让本地页面跟踪到目前为止在文本框中检索/显示的行。
本地页面会定期使用AJAX轮询后端并请求已读取的任何新数据(告诉它到目前为止页面有哪些行,并且从那时起只检索新行)。
这将一直持续到整个文件被完全检索为止。
问题是从文件读取的bean方法正在运行阻塞的while循环。所以从数据结构中读取它同时写入将需要使用额外的线程,对吗?我听说在Web应用程序中生成新的Threads是一个潜在的危险行为,应该使用线程池等。
有人可以对此有所了解吗?
更新:我尝试了几件不同的事情,没有运气。但是我确实设法通过生成一个单独的Thread
来运行我的阻塞循环来使它工作,而主要线程可以用来在处理AJAX请求时从中读取它。是否有一个很好的库可以用来做类似的事情,仍然给JSF一些生命周期控制Thread
?
答案 0 :(得分:1)
您是否考虑过实现Future接口(包含在Java5 + Concurrency API中)?基本上,当您在文件中读取时,您可以将其拆分为多个部分,然后只创建一个新的Future对象(对于每个部分)。然后,您可以在计算完成后让对象返回。
这样,您可以防止在循环操作结构时访问该结构,并且还可以将操作拆分为较小的计算,从而减少锁定发生的时间(总锁定时间可能更长,但您可以更快地响应别的地方)。如果维护Future对象的创建顺序,则不需要跟踪#行。请注意,调用Future.get()会阻塞,直到对象“准备好”。
你们其余的方法是相似的 - 进行Ajax调用,从FIFO队列中获取所有“准备好”的Future对象的内容。
我想我明白你要完成的事情......也许更多的信息会有所帮助。