有没有人能分享一下他们在Java环境中调用unix脚本的经验,无论是servlet还是EJB?请注意,这些脚本将被调用以进行实时处理,而不是离线处理。
发布于 2010-01-28 07:33:21
从Java容器派生进程可能不是正确的方法。如果这些是shell脚本,则它们将不可移植。如果要使用事务支持,可以使用Quartz Scheduler将脚本重写为作业。这更像是用Java的方式来做这样的事情。
编辑:将你的需求添加到评论中,这应该是可行的
Process process = new ProcessBuilder(command).start();
更多详细信息here
请注意,如果您使用脚本和/或管道(无本机可执行文件),则必须包含shell来调用命令(和设置管道)
发布于 2010-01-28 07:27:39
您将遇到的最大问题是,如果您的应用程序服务器内存映像很大,当您派生运行脚本时,很可能会耗尽内存,导致派生失败。当您派生时,系统需要制作可执行映像的完整副本。它不会制作物理副本,但它确实需要制作虚拟副本。因此,如果您有一个大的Java EE堆,比如4G的实际内存(即,不仅仅是Java堆,还有总进程大小),那么您需要额外的4G的实际RAM和/或交换空间,以便fork有足够的虚拟空间。
是的,您将立即执行sh或其他不会占用大量资源的命令。但是系统不能知道这一点,因此它需要表现得好像它必须同时运行Java EE容器的两个副本,即使是一纳秒。
如果没有fork所需的资源,fork就会失败。
如果你的空间有限,那么你能做的就是创建一个小型的exec启动守护进程。然后,您只需打开一个到守护进程的套接字,IT就会派生进程,而不是Java EE应用程序派生进程。显然,期望这个小守护进程消耗的资源比您的容器少得多,所以它的派生成本很低。
守护进程可以像通过套接字执行命令行一样简单,并且只执行它得到的东西(可能不安全,当然,但是...),或者是简单的rpc,带有命令代码和一些参数。任何适合您项目的内容。您可以用Java、一种脚本语言(Python、Perl、Ruby)或其他语言编写它。有很多方法可以做到这一点。
发布于 2010-02-02 00:02:14
一种可能性是编写一个侦听JMS队列并调用脚本的小型应用程序。这样,脚本执行与应用服务器分离,因此不会遇到任何规范限制。
https://stackoverflow.com/questions/2152869
复制相似问题