Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glassfish Java应用程序服务器(WebLogic)能否管理本机可执行文件?_Glassfish_Weblogic_Native_Failover - Fatal编程技术网

Glassfish Java应用程序服务器(WebLogic)能否管理本机可执行文件?

Glassfish Java应用程序服务器(WebLogic)能否管理本机可执行文件?,glassfish,weblogic,native,failover,Glassfish,Weblogic,Native,Failover,有没有可能(…完全知道这是疯狂的,也是严重不明智的…)让J2EE应用程序在Java应用程序服务器中运行(目前使用weblogic),并让本机可执行进程作为Java应用程序生命周期的一部分启动、使用和停止?(注意:这不是JNI,它实际上是一个独立的本机进程。它是unix/linux,但也应该在windows上运行。)我还没有找到任何关于这个主题的文档——可能是有原因的 背景:本机进程实际上是一些不可破解的第三方软件包,除了stdin/stdout之外没有其他API。Java应用程序要求本机应用程序

有没有可能(…完全知道这是疯狂的,也是严重不明智的…)让J2EE应用程序在Java应用程序服务器中运行(目前使用weblogic),并让本机可执行进程作为Java应用程序生命周期的一部分启动、使用和停止?(注意:这不是JNI,它实际上是一个独立的本机进程。它是unix/linux,但也应该在windows上运行。)我还没有找到任何关于这个主题的文档——可能是有原因的

背景:本机进程实际上是一些不可破解的第三方软件包,除了stdin/stdout之外没有其他API。Java应用程序要求本机应用程序执行某些服务。我可以通过ProcessBuilder轻松地包装本机进程,启动/停止并与之通信(使用stdin/stdout)。出于测试目的,我有一个简单的exe(C++),它通过stdin/stdout进行通信,可以接收“启动”、“关闭”并执行简单的“回显”服务。(如果本机进程成功启动,“start”是no op,但只返回“ok”。)

因此,理想情况下,当启动/关闭应用程序服务器和/或启动/关闭部署的Java应用程序时,也可以启动/关闭关联的本机进程。理想情况下,这种情况可以干净可靠地发生(关闭后没有延迟过程,记录所有启动故障,同步生命周期计时问题)

如果这确实有效,那么问题的“第2部分”将是这是否可以在集群/故障切换环境中有效。本机流程可以绑定到特定于平台和软件的监视和管理服务,但如果可能的话,我希望所有内容都与Java应用程序捆绑并管理

如果Glassfish或任何其他OSGi类型的环境可以让这变得更简单,请随时告诉我(这可能是一个选项……我更喜欢Glassfish,但WLS是总括性的要求。)

我正试图提出一个概念证明,但任何明确的答案“是的,我已经做到了”或“不,它不会起作用”都会非常感激&这是一个巨大的时间节约(如果你有支持文档链接的话)


编辑:只是澄清一下(这个主题可能有误导性):还有相当多的Java应用程序正在运行(我已经编写了,可以根据需要自由修改);第三方本机进程只执行Java应用程序所需的服务。我不仅仅是试图通过应用服务器管理本机进程。

第1部分的答案是肯定的,让Java应用服务器管理本机系统进程是绝对可能的。如果您正在考虑使用
ProcessBuilder
生成外部程序并与之交互,那么听起来您自己已经基本解决了这个问题。这差不多就是做这件事的方法

我在过去使用过这种设置,在Java服务器上实现了媒体转码服务(Java服务器通过ffmpeg进程生成转码作业,监视它们的状态,并在成功/失败等情况下向应用程序的其余部分报告)。这一切能做得多干净取决于你如何实现它,取决于你的外部应用程序的行为(即,它是否保证对关机请求做出优雅、快速的响应?),但要让它完全完美是非常困难的(如果不是不可能的话)。至少,如果有人在Java服务器进程上执行了
kill-9
,您就无法正常关闭本机进程,至少在服务器重新启动并且您看到本机进程已经在运行之前是这样

第二部分取决于“在集群/故障转移环境中工作”的确切含义。在管理本机进程方面,如果您可以用Java启动它并与之交互,那么您也可以用Java管理它。但是,如果您的意思是希望实现完美的故障切换行为,即如果带有本机进程的节点出现故障,则新节点会自动恢复与以前完全相同的进程状态,那么这可能非常困难,甚至是不可能的。但是,如果您将与外部流程的交互抽象出来,使其仅显示为Java代码与之交互的服务(例如,可能通过向了解如何与外部流程交互和管理外部流程的facade类发送请求),那么您应该能够获得一些相当好的结果


我实现的代码转换服务在集群环境中运行(使用JBoss/Tomcat),其工作方式是当请求代码转换作业时,将发送消息。该消息将由一个协调类接收,该类将管理转码请求队列,并在工作进程可用时生成作业。队列的状态在集群中被复制,因此如果运行ffmpeg进程的节点停止运行,则当前计划的作业将被记住,然后在合适的节点再次可用时恢复(转码服务是可配置的,以便可以为每个节点启用/禁用)。实践证明,该系统相当健壮。

谢谢。复制的工作请求队列是一个简单的好主意。