2010-06-19 47 views
1

我想开发一个应用程序,在quit之前必须运行一个新的守护进程来执行主要方法一类。JDK 6:有没有办法运行一个新的java进程,执行指定类的主要方法

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

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

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

呼叫运行守护进程和退出离开该守护进程在执行状态下的第一Java方法

和然后(具有守护进程向上和会话控制,因为在最后一次调用终止)必然

呼叫与该守护进程进行通信的方法(即退出最后在通信结束时)

这可能吗?

感谢

更新

我的确切需要的是创造和加载(达到最好的表演),一个大的文本文件导入数据库假设主机不从具有文件传输服务Java JDK6客户端应用程序使用JDBC-11G oci驱动程序连接到Oracle 11gR1数据库。

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

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

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

希望得到澄清

回答

1

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

如果这样的事情是可能的,这个技术可能是Oracle特有的。

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

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

例如,如果您希望每小时运行一些Java代码,那么几乎可以肯定地有更简单的方法来实现该效果。操作系统和数据库倾向于在期望的时间启动工作。因此,在需要时调用存储过程可能是您的环境中已经存在的功能。因此,您只需将所需的代码放入存储过程即可。不需要你手工编排,启动和管理。这种方法的一个非常重要的优点是,你最终会使用一个技术,其他人在你的环境中已经理解了。

编写你正在考虑的代码的类型是非常有趣,很有趣,但在商业环境中往往是浪费的努力。

+0

nice guitar +1;) – OlimilOops 2010-06-19 09:18:15

+0

我有疑问这是可能的,但我也试图寻找不同的解决方案。 我没有评估使用事件编程,但这会稍微复杂一点,因为这样做我想我应该: 连接到数据库以建立第一个会话,然后在终止之前等待QUIT事件。 再次连接到另一个线程中的数据库,并建立第二个会话,其行为像守护进程并生成QUIT事件。 一旦第一个会话终止,其线程可以执行与剩余会话的通信。 你认为它可以工作吗? – 2010-06-19 09:28:48

+0

@Oops - 是的,它是Takamine LTD 99,只希望我能更好地演奏它! – djna 2010-06-19 09:43:27

0

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

+0

正如我在问题中所述,我无法使用Runtime.exec(),因为我正在使用无法从操作系统访问的数据库存储过程。 – 2010-06-19 09:38:52

0

您在Java中启动子流程的方式是Runtime.exec()(或其更方便的包装器,ProcessBuilder)。如果这不起作用,那么你就是SOL,除非你可以使用本地代码来实现等价的功能(在这里问另一个问题来学习如何在C++层次上启动子进程),但是至少至少有容易出错使用标准方法。

如果像Oracle这样的应用程序服务器允许您访问启动子进程或加载本机代码的功能,我会感到惊讶;两者都可能导致巨大的恶作剧,因此不可信的代码被禁止。纵观你的编辑,你最好的办法是重新思考你如何解决你真正的问题,例如,通过使用NIO来更有效地管理套接字(并且不要在磁盘上创建额外的文件;你只是必须把额外的详细代码清理起来......)

相关问题