![]() |
1
2
我将使用选项3,特别是如果您实际上不需要知道脚本何时完成(或者除了等待进程结束之外,您还可以使用其他方法来发现)。 选项1浪费了一个等待脚本完成的线程。选项2似乎是个坏主意。我不会劫持servlet容器线程。 |
![]() |
2
3
你提到了石英,所以我们来选一个选项4(这是我的最佳选择): PS:最大的问题可能是找到文档,这是我能找到的最好的来源: How to use NativeJob? |
![]() |
3
2
您的应用程序是否需要评估您正在启动的脚本的输出,或者这是一个简单的fire-and-forget作业?如果不需要,您可以“滥用”runtime.getruntime().exec()将立即返回,进程将继续在后台运行这一事实。如果您实际上希望等待脚本/进程完成,则必须对exec()返回的进程对象调用wait for()。 如果要开始的进程向stdout或stderr写入任何内容,请确保将这些内容重定向到日志文件或/dev/null,否则该进程将在一段时间后阻塞,因为stdout和stderr可以作为通过进程对象的缓冲能力有限的输入流使用。 |
![]() |
4
1
我的方法可能如下:
它有点手摇,但根据你的webapp的结构,你可能可以在某处安装这些通用组件。 |
![]() |
5
1
如果您的HTTP响应/用户不需要看到脚本的输出,或者不需要知道脚本何时完成,那么您最好的选择是在您提到的某种包装脚本中启动线程,这样它就可以作为一个整体在servlet容器环境之外运行。这意味着您可以免除自己在容器中管理线程的需要,或者像您提到的那样劫持线程等。 只有当需要通知用户脚本何时完成和/或监视脚本的输出时,我才会考虑选项1或2。 |
![]() |
6
0
对于第二个选项,您可以使用servlet,并且在您响应HTTP请求之后,可以使用java. Lang.RunTime.Excor()执行脚本。我还建议你看看这里: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html …对于使用它的一些问题和陷阱。 |
![]() |
7
0
异步后端进程最健壮的解决方案是使用消息队列IMO。最近,我使用Spring嵌入式ActiveMQ代理实现了这一点,并安装了一个生产和消费bean。当需要启动一个作业时,我的代码会调用生产者,后者会将消息放到队列中。使用者订阅了队列,并被消息在单独的线程中启动。这种方法巧妙地将UI与排队机制(通过生产者)和异步进程(由使用者处理)分开。 注意,这是一个Java 5,Spring配置的环境,运行在开发机器上的Tomcat服务器上,并部署到测试/生产机器上的WebLogic上。 |
![]() |
8
0
您的问题源于这样一个事实:您正试图违背J2EE中的“每个请求一个响应”模型,并在后端任务执行时动态更新最终用户的页面。 除非您想继续介绍基于Ajax的解决方案,否则必须强制用户浏览器上呈现的页面定期“轮询”服务器以获取信息,直到后端任务完成。 这可以通过以下方式实现:
这是一种实现您想要的东西的方法——它不是所有方法中最优雅的方法,但它本质上是由于需要使用请求/响应模型从服务器异步更新页面内容。 实现这一点还有其他方法,但这实际上取决于您的约束有多不灵活。我听说过 Direct Web Remoting (虽然我还没玩过),也许值得一看 Developing Applications using Reverse-Ajax |