`
Rocky_rup
  • 浏览: 145390 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
很早,就知道像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成功!

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

分享到:
评论
3 楼 diz 2007-09-25  
....
2 楼 diz 2007-09-25  
江南白衣 写道
看看jboss的实现,很简单,没几行代码啊。


需要吗?我映像中JBOSS的服务组件都是通过MBEAN SERVER起起来的!而MBEAN Server可以直接通过JNDI查出来,然后根据Name找到子Bean! 随便start(),stop()
1 楼 江南白衣 2007-09-25  
看看jboss的实现,很简单,没几行代码啊。

相关推荐

    RMI-File-Submission-System-master.zip_java_submission_tornkaj

    它使用`RMIClient`类或相似组件,通过RMI查找并获取服务端的远程对象引用,然后调用`submitFile()`方法将文件数据传输给服务端。这个过程通常涉及序列化和反序列化,因为Java对象不能直接在网络间传递,必须转换为可...

    java-RMI-math-operator-server-client.zip_Math Class

    服务器端(server)会实现这个接口,并通过RMI注册服务,使得客户端(client)可以找到并调用这些远程方法。服务器端代码通常包括以下步骤: 1. 实现`MathOperations`接口。 2. 创建RMI注册表(Registry),这是...

    RMI-EA-Pro-V2.6-demo_mt4_

    "RMI"可能是“远程方法调用”(Remote Method Invocation)的缩写,暗示了该EA可能采用了先进的计算技术和数据处理方式。 在外汇交易中,EA的使用有以下几个显著优势: 1. **自动化交易**:EA可以自动执行买卖操作...

    RMI-remote-file-transfer.rar_remote_rmi file transfer

    Java RMI(Remote Method Invocation,远程方法调用)是一种在分布式环境中进行对象间通信的技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法。在这个"RMI-remote-file-transfer.rar"项目...

    rmi-xlr-mips-program-manual

    MIPS架构的指令集是手册的重要组成部分,它详述了每条指令的功能、格式和使用方法。此外,手册可能还会涵盖与主流编译器(如GCC)的交互,包括特定的编译选项和优化策略,以获得最佳性能。 5. **调试和性能分析** ...

    RMI聊天室-Java实现

    Java RMI(Remote Method Invocation,远程方法调用)是一种在分布式环境中实现对象间通信的技术,它允许一个Java对象调用另一个在不同Java虚拟机(JVM)上的对象的方法。RMI是Java EE平台中的核心组件之一,常用于...

    rmi原理-chn-pdf

    RMI(Remote Method Invocation,远程方法调用)是一种Java平台上的技术,它允许开发者在不同JVM间的对象间进行方法调用,就像是本地方法调用一样简单。这项技术的出现极大地简化了分布式系统的开发工作,并成为了...

    RMI RMI-IIOP 客户端服务器交互

    在Java世界中,远程方法调用(Remote Method Invocation, RMI)是一种机制,它允许一个对象的方法被另一个网络上的对象调用,实现了分布式计算。RMI-IIOP是RMI的一个扩展,它结合了RMI的功能与CORBA的IIOP(Internet...

    RMI 简单示例-Java Remote Methods Invocation

    - **远程接口**:这是定义远程方法的Java接口,需要使用`java.rmi.Remote`作为其父接口。 - **远程实现**:实现了远程接口的类,通常运行在服务器端,负责处理客户端的请求。 - **注册表(Registry)**:RMI的...

    RMI-IIOP 基于SUN

    RMI-IIOP(Remote Method Invocation - Internet Inter-ORB Protocol)是一种在Java平台上实现分布式计算的技术,它结合了Java RMI(远程方法调用)和CORBA(Common Object Request Broker Architecture)的IIOP...

    rmi-lite 1.0

    RMI的工作原理是通过Java序列化机制来传递对象,并使用Java的动态代理来实现方法调用的透明性。在【rmi-lite】中,可能会简化了注册表、安全性、异常处理等部分,以降低系统开销和复杂性,更适合小型或特定需求的...

    RMI售票管理-java

    在Java编程领域,RMI(Remote Method Invocation,远程方法调用)是一种强大的技术,用于构建分布式应用程序。RMI允许一个Java对象在某一个Java虚拟机(JVM)中调用另一个JVM中的对象的方法,实现了跨越网络的透明...

    easybeans-modules-rmi-interceptors-1.2.0-m3-jonas.jar

    jar包,官方版本,自测可用

    cmi-rmi-2.0-rc2-sources.jar

    jar包,官方版本,自测可用

    easybeans-modules-rmi-interceptors-2.0.0-m2.jar

    jar包,官方版本,自测可用

    easybeans-modules-rmi-interceptors-2.0.0-m1.jar

    jar包,官方版本,自测可用

    easybeans-modules-rmi-interceptors-1.2.0-m5.jar

    jar包,官方版本,自测可用

    easybeans-modules-rmi-interceptors-1.2.0-m4.jar

    jar包,官方版本,自测可用

    easybeans-modules-rmi-interceptors-1.2.0-m3.jar

    jar包,官方版本,自测可用

    spring RMI 服务(自动把service发布为RMI服务)

    Spring RMI服务是一种在Java平台上实现远程方法调用(Remote Method Invocation, RMI)的技术,它允许分布式系统中的不同组件通过网络进行通信。在Spring框架的支持下,我们可以更方便地将服务发布为RMI服务,使得...

Global site tag (gtag.js) - Google Analytics