0

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

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

因此,理想情况下,当应用程序服务器启动/关闭,和/或部署的 Java 应用程序启动/关闭时,关联的本机进程也可以启动/关闭。理想情况下,这可以干净而可靠地发生(关闭后没有挥之不去的进程,记录所有启动失败,同步生命周期时间问题)。

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

如果 Glassfish 或任何其他 OSGi 类型的环境会使这变得更简单,请随时告诉我(这可能是一种选择......我更喜欢 Glassfish,但 WLS 是一揽子授权。)

我正在尝试组合一个概念验证,但任何明确的答案“是的,我已经完成了”或“不,它不会工作”将不胜感激并节省大量时间(支持文档链接,如果有的话)。

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

4

1 回答 1

1

第 1 部分的答案是肯定的,绝对有可能让 Java 应用程序服务器管理本机系统进程。ProcessBuilder如果您正在考虑使用 a来生成外部程序并与之交互,这听起来您已经自己想通了。这几乎就是这样做的方法。

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

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

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

于 2011-05-04T01:57:10.223 回答