1

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

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

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

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

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

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

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

这可能吗?

谢谢

更新

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

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

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

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

希望清楚

4

3 回答 3

1

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

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

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

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

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

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

于 2010-06-19T09:13:54.597 回答
0

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

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

于 2010-06-19T12:15:05.447 回答
0

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

于 2010-06-19T09:19:55.387 回答