我正在尝试将一个非java可执行文件集成到服务器端(linux)的javawebapp中。
有关可执行文件的一些详细信息:
用c++编写。可执行文件从stdin或file获取一些输入,并生成一个输出文件。可执行文件不是设计为长时间运行的进程,即它生成一个输出,然后消失。
虽然为可执行文件启动一个单独的进程是相当便宜的,但是对它的调用次数可能很高。这可能导致生成太多进程,从而降低服务器性能。
如何围绕这个exe编写一些 Package 器或实用程序(用java编写),使其能够高效运行
我的java应用程序中的线程
长期运行的外部进程
ps:我知道我可以用java中的runtime或processbuilder启动一个外部进程,也可以使它成为多线程的,还可以使用一些队列,但这并不能解决反复启动进程的问题。
4条答案
按热度按时间ar7v8xwq1#
有多少个进程是“太多”?我建议在进行下一步之前先衡量一下表现。在这种情况下,您可以启动并运行比预期更多的进程,特别是因为程序的代码将在所有示例的内存中共享。
inb24sb22#
如果你:
a) 可以修改源代码。
我建议您创建一个长时间运行的进程,并将其公开为webservice。这样,进程将只在那里等待被调用。
b) 有源代码/头,但你不能修改它。
也许一个好主意是将它集成为库并从java调用它,无论是使用jni还是jna,尽管这可能非常困难。
c) 没有源代码或无法修改它。
然后没有太多的选项,您必须创建一个线程队列,并从那里限制进程的创建。
uplii1fm3#
java中的throttle可以使用合适的执行器来完成。有很多容易获得的执行器-我认为固定大小的线程池正是你需要的。
http://java.sun.com/javase/6/docs/api/java/util/concurrent/executors.html#newfixedthreadpool%28内景%29
nue99wik4#
如果启动c应用程序花费的时间太长,那么几乎可以肯定的是,您将不得不编写一些c代码来避免这种情况。
另一种方法是用合适的api将c重构成一个库,并使用jni或jna从java调用api。然而,jni/jna很难使用,并且有破坏jvm稳定性的趋势。当出现问题时(例如jvm崩溃),调试是困难的。
更好的替代方法是重构c应用程序以作为守护进程运行。将“main”入口点替换为位于循环中的代码,执行以下操作:
如果您使用管道,您可以让您的javawebapp使用
Runtime.exec(...)
然后通过管道流读写消息。如果使用(ipc或网络)套接字,则可以执行相同的操作,或者使c应用程序多线程化,以便它一次可以处理多个请求。您需要考虑的一个问题是多线程。默认情况下,web容器(运行webapp的东西)可能是多线程的,因此需要实现java端来处理c端的多线程或单线程特性。这可能与使用同步方法将用于发出请求的java端对象设置为单例一样简单。然而,这可能是一个性能瓶颈。