我理解以下是从java
启动exe的典型代码Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("some.exe");
或带参数
Process process = new ProcessBuilder("some.exe","param1","param2").start();
我有一个包装exe的Web应用程序,用户可以根据请求执行这些操作。据我所知,上述两种方法始终在每个请求上创建一个新流程。我想避免这种情况。
是否有办法,其中我保留可重复使用的加载实例池并在典型的并发场景中使用它们。我希望避免每个用户请求启动新进程的情况。
答案 0 :(得分:1)
外部进程的开始是昂贵的,而不是创建Java对象Process
。
如果您的exe实现了某种具有协议通信的服务器,您只需启动它并使用该协议即可。但那么这个问题就不会有问题了。
如果它是一个简单的工具,例如处理文件的东西,你需要每次启动它并依赖(或调整)操作系统的/文件系统的缓存机制。没有办法暂停或重复使用它。
答案 1 :(得分:1)
这取决于some.exe
是否支持此功能。例如,命令ls
(或dir
)执行其操作并停止。没有办法告诉它“再做一次” - 你需要一种与进程通信的方法,并且进程必须有一些接口(通常是stdio),你可以使用它来远程控制它。
如果您的外部进程无法执行此操作,则必须为每个请求创建一个新进程,或者您必须在其他位置运行该进程并将结果保留在缓存中一段时间,因此有几个用户请求获取相同的数据,而无需运行该过程。
因此,如果每个用户和每分钟收到100个请求,并且数据可能只有一分钟,那么您可以每分钟运行一次并重复使用旧结果。
答案 2 :(得分:0)
您考虑过Apache Commons Pool了吗?对于这种情况应该足够了。
答案 3 :(得分:0)
Commons Pool如何与Commons Exec结合?
答案 4 :(得分:0)
由于您在命令行上传输参数,并且执行的子进程无法回收,也不会在内存中保持持久性,因此您的请求看起来不是很有用 - 您唯一可以保存的是创建进程框架,但是只是到了一定程度。