2012-12-12 31 views
0

所以我有一些Java代码需要一些时间来完成(大约2分钟)。我无能为力。在XPage中长时间运行Java代码的最佳方法是什么?

但我想知道在XPage UI中如何最好地实现这一点,以便用户可能仍然需要等待,但在运行时(而不仅仅是一个旋转的轮子)有更多的控制/交互。

所以从我所看到的我可以做到以下几点。

  • XPage中调用的Java类包装在一个线程中。
  • Java代理程序在线程中从XPage中调用。
  • Java Agent从XPage调用,但等待文档被更新。
  • Eclipse插件(用于客户端中)已激活。不知道它会如何回答XPage(通过文档?)。

其他方法?

如果您在XPage中创建线程,是否会在服务器端导致任何问题?我是否必须避免在Java类中使用Notes对象?

+1

也许这篇文章由Mark Leusink给你一些启发? http://linqed.eu/?p=174 –

+0

另外这个来自Niklas Heidloff(OpenNTF)http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=threads –

回答

7

我建议使用OSGi Tasklet服务,也叫做DOTS。这种方法允许将Java任务调度或绑定到事件,就像代理程序一样,但执行效率要比代理程序高得多。也许最适合您的需求的是通过控制台触发DOTS任务的额外能力,这将允许您的XPage代码仅通过通过session对象发出远程控制台命令来启动Java代码。

另外,请查看XSP Starter Kit中使用的技术,以提供serverScope变量。如果您的代码运行在DOTS任务(甚至是代理程序)中,则它运行在不同的Java应用程序中,因此它无法直接与标准范围变量进行通信。 serverScope方法在理论上允许您存储可以从XPage和触发任务访问的对象。如上所述,这可以帮助使用Mark的技术,以便在任务运行时向用户传达进度:您只需将进度信息存储在serverScope而不是sessionScope中。

+0

谢谢。你给了我很多东西来阅读和思考。 serverScope方法对我想要做的事情看起来很有用。 – Herty

+0

另一种方法是在XPages中使用一个线程:http://www.wissel.net/blog/d6plinks/SHWL-99U64Q。对于XPiNC应用程序,我使用经典插件并扩展客户端复制器 – stwissel

0

一个解决办法是有一个代理人在数据库中保存新文档,而不是在你的应用和使用线程剂踢(因为线程可能是非常危险的,很容易杀死你的HTTP任务)

反应

您可以研究的另一件事是为什么您要执行的代码需要2分钟才能完成。什么是代码?在其他数据库中执行操作或连接到其他非注释资源?

+1

I回应第二个建议。 Java运行时在XPage中(与代理相对)进行了高度优化,所以在几毫秒内就可以完成很多工作。如果这段代码耗时120,000毫秒,我有信心保证它可以显着优化。这就是说,你可能不可能从2分钟到2秒进行优化。所以一旦你确定代码和现实一样高效,请参阅下面的答案,以获得代理的替代选择。 –

+0

工作流程为2分钟(并且已经优化),但是我通过线程来分解它,以便让它在没有太多中断的情况下在后台运行。它呼叫到一个旧的后端服务器,所以滞后在那里。 – Herty

相关问题