【问题标题】:JDK 6: Is there a way to run a new java process that executes the main method of a specified classJDK 6:有没有办法运行一个新的java进程来执行指定类的main方法
【发布时间】:2011-03-05 17:39:25
【问题描述】:

我正在尝试开发一个应用程序,它在退出之前必须运行一个新的守护进程来执行类的主要方法。

我要求在主应用程序退出后,守护进程必须仍在执行中。

它是在 Oracle DB 上运行的 Java 存储过程,因此我无法使用 Runtime.exec,因为我无法从操作系统 Shell 中找到 java 类,因为它是在数据库结构而不是文件系统文件中定义的。

特别是期望的行为应该是在远程数据库会话期间我应该能够

调用第一个运行守护进程并退出的java方法,让守护进程处于执行状态

然后(启动守护进程和会话控制,因为最后一次调用终止)结果

调用与守护进程通信的方法(最终在通信结束时退出)

这可能吗?

谢谢

更新

我的确切需要是创建一个大文本文件并将其加载(达到最佳性能)到数据库中,假设主机没有来自使用 JDBC-11G 连接到 Oracle 11gR1 DB 的 Java JDK6 客户端应用程序的文件传输服务oci 驱动程序。

我已经通过调用一个过程来开发一个可行的解决方案,该过程将作为输入提供的 LOB(大型数据库对象)存储到一个文件中,但是这种方法使用了太多我想避免的中间结构。

所以我考虑通过第一次调用在数据库上创建一个 ServerSocket,然后连接到它并通过直接和快速的通信建立数据传输。

我遇到的问题是因为创建ServerSocket的java程序无法退出并留下一个正在执行的线程/进程监听该Socket和客户端,以确保ServerSocket已经创建,无法运行一个单独的线程来处理剩下的工作。

希望清楚

【问题讨论】:

    标签: java oracle11g java-6 java-stored-procedures


    【解决方案1】:

    如果这是可能的,我会感到惊讶。实际上,您可以用无限数量的守护进程使 DB 服务器机器饱和。

    如果这样的事情是可能的,该技术很可能是特定于 Oracle 的。

    也许您可以使用数据库触发器或其他此类事件驱动的数据库功能来实现您想要的效果。

    我建议您解释您要解决的确切问题,为什么需要守护程序?我的直觉是,试图管理你的守护进程的生活会变得非常复杂。您可能需要处理诸如防止启动两个实例、意外终止守护程序、在需要维护时关闭守护程序等问题。这种事情会变得非常混乱。

    例如,如果您想每小时运行一些 Java 代码,那么几乎可以肯定有更简单的方法可以实现该效果。操作系统和数据库往往具有在所需时间启动工作的好方法。因此,在需要时调用存储过程可能是您的环境中已经存在的功能。因此,您需要做的就是将所需的代码放入存储过程中。无需您手工制作调度、启动和管理。这种方法的一个非常显着的优势是,您最终会使用您所在环境中的其他人已经了解的技术。

    编写您正在考虑的那种代码非常有趣且非常有趣,但在商业环境中通常是浪费精力。

    【讨论】:

    • 我怀疑这是否可能,但我也在尝试寻找不同的解决方案。我没有评估使用事件编程,但这会有点复杂,因为这样做我想我应该:连接到数据库以建立第一个会话,然后在终止之前等待 QUIT 事件。在不同的线程中再次连接到数据库并建立第二个会话,该会话的作用类似于守护进程并生成 QUIT 事件。一旦第一个会话终止,它的线程可以执行与剩余会话的通信。你认为它可以工作吗?
    • @Oops - 是的,它是 Takamine LTD 99,只希望我能玩得更好一点!
    【解决方案2】:

    为您的其他 Main 类制作另一个 jar,并在您的主应用程序中使用 Runtime.getRuntime().exec() 方法调用该 jar,该方法应该运行一个运行您的其他 Main 类的外部程序(另一个 JVM)。

    【讨论】:

    • 正如我在问题中所说,我不能使用 Runtime.exec() 因为我正在使用操作系统无法访问的数据库存储过程。
    【解决方案3】:

    在 Java 中启动子进程的方式是 Runtime.exec()(或更方便的包装器 ProcessBuilder)。如果这不起作用,那么您就是 SOL,除非您可以使用本机代码来实现等效功能(在此处提出另一个问题以了解如何在 C++ 级别启动子进程)但那将是至少与使用标准方法一样容易出错。

    如果像 Oracle 这样的应用服务器允许您访问启动子进程或加载本机代码的功能,我会感到震惊;两者都可能造成巨大的恶作剧,因此禁止使用不受信任的代码。查看您的编辑,您最好的方法是重新考虑如何解决您的实际问题,例如,通过使用 NIO 以更有效的方式管理套接字(并尽量不在磁盘上创建额外的文件;您只需必须添加额外的复杂代码来清理它们……)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 2013-05-12
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多