论坛首页 Java企业应用论坛

RMI的意外用法--shutdow服务进程

浏览 3556 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-24   最后修改:2008-12-13
很早,就知道像Tomcat、JBoss这样的服务器系统可以通过startup.bat启动,而之后可以用shutdown.bat关闭。

项目初始,我也希望像这样实现,startup容易,可shutdown难。在网上搜了好久都没有关于这样的实现方法的线索。
倒是有个这样的实现:

java 代码
 
  1. Runtime.getRuntime().addShutdownHook(new Thread() {  
  2.   
  3.         public void run() {  
  4.                 System.exit(0);  
  5.         }  
  6.   
  7. });  

把这样代码加入到程序入口类的Main函数中,就可以通过关掉开启程序的控制台(也就是运行java XXX.class的dos窗口)来回调上面的
run(),结束程序。

可是这不是我想要的答案啊,随即我又研究了tomcat的shutdown.bat批处理文件,唉,内容复杂得让人晕菜,结论是这个批处理文件调用了一
个类,可到此我的耐心没有让我有动力继续研究它的源代码,那时就作罢了。

而今,研究RMI时候,我突然又冒出这个念头,为什么不用RMI实现一把呢?于是就有下面代码:

Exitable.java

java 代码
 
  1. import java.rmi.Remote;  
  2. import java.rmi.RemoteException;  
  3.   
  4. public interface Exitable extends Remote {  
  5.         public void exit() throws RemoteException;  
  6. }  



Startup.java
java 代码
 
  1. import java.net.MalformedURLException;  
  2. import java.rmi.Naming;  
  3. import java.rmi.RemoteException;  
  4. import java.rmi.registry.LocateRegistry;  
  5. import java.rmi.server.UnicastRemoteObject;  
  6.   
  7. /** 
  8.  * @author cityhunter 
  9.  * 
  10.  */  
  11. public class Startup extends UnicastRemoteObject implements Exitable {  
  12.         /**  */  
  13.         private static final long serialVersionUID = 1L;  
  14.   
  15.         protected Startup() throws RemoteException {  
  16.                 super();  
  17.         }  
  18.   
  19.         /** 
  20.          * @param args 
  21.          */  
  22.         public static void main(String[] args) {  
  23.                 System.out.println("start");  
  24.                 try {  
  25.                         LocateRegistry.createRegistry(1099);  
  26.                         Naming.rebind("main"new Startup());  
  27.                 } catch (RemoteException e) {  
  28.                         e.printStackTrace();  
  29.                 }  
  30.                 catch (MalformedURLException e) {  
  31.                         e.printStackTrace();  
  32.                 }  
  33.   
  34.         }  
  35.   
  36.         public void exit() {  
  37.                 System.out.println("savant end");  
  38.                 System.exit(0);  
  39.         }  
  40. }  


Shutdown.java
java 代码
 
  1. import java.net.MalformedURLException;  
  2. import java.rmi.Naming;  
  3. import java.rmi.NotBoundException;  
  4. import java.rmi.RemoteException;  
  5.   
  6. public class Shutdown {  
  7.   
  8.         /** 
  9.          * @param args 
  10.          */  
  11.         public static void main(String[] args) {  
  12.                 try {  
  13.                         Exitable e = (Exitable) Naming.lookup("main");  
  14.                         e.exit();  
  15.                 } catch (MalformedURLException e) {  
  16.                         e.printStackTrace();  
  17.                 } catch (RemoteException e) {  
  18.                         e.printStackTrace();  
  19.                 } catch (NotBoundException e) {  
  20.                         e.printStackTrace();  
  21.                 }  
  22.         }  
  23. }  



这个方法也不是一次就成功的,中间修改过多次,主要是最先写好的代码中有开篇提到的addShutdownHook方法,只是运行shundown时始
终不能关闭。郁闷很久后,依稀记得addShutdownHook方法是启用另一线程来关闭的,会不会是它产生的线程没有自我关闭呢?带着这个猜测,我
删掉了addShutdownHook方法的代码,结果运行shutdown成功!

按理这样成功了,就说明我的猜测是正确的,但其中有种说不来的想不通,还望!

   发表时间:2007-09-25  
看看jboss的实现,很简单,没几行代码啊。
0 请登录后投票
   发表时间:2007-09-25  
江南白衣 写道
看看jboss的实现,很简单,没几行代码啊。


需要吗?我映像中JBOSS的服务组件都是通过MBEAN SERVER起起来的!而MBEAN Server可以直接通过JNDI查出来,然后根据Name找到子Bean! 随便start(),stop()
0 请登录后投票
   发表时间:2007-09-25  
....
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics