很早,就知道像Tomcat、JBoss这样的服务器系统可以通过startup.bat启动,而之后可以用shutdown.bat关闭。
项目初始,我也希望像这样实现,startup容易,可shutdown难。在网上搜了好久都没有关于这样的实现方法的线索。
倒是有个这样的实现:
java 代码
- Runtime.getRuntime().addShutdownHook(new Thread() {
-
- public void run() {
- System.exit(0);
- }
-
- });
把这样代码加入到程序入口类的Main函数中,就可以通过关掉开启程序的控制台(也就是运行java XXX.class的dos窗口)来回调上面的
run(),结束程序。
可是这不是我想要的答案啊,随即我又研究了tomcat的shutdown.bat批处理文件,唉,内容复杂得让人晕菜,结论是这个批处理文件调用了一
个类,可到此我的耐心没有让我有动力继续研究它的源代码,那时就作罢了。
而今,研究RMI时候,我突然又冒出这个念头,为什么不用RMI实现一把呢?于是就有下面代码:
Exitable.java
java 代码
- import java.rmi.Remote;
- import java.rmi.RemoteException;
-
- public interface Exitable extends Remote {
- public void exit() throws RemoteException;
- }
Startup.java
java 代码
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.RemoteException;
- import java.rmi.registry.LocateRegistry;
- import java.rmi.server.UnicastRemoteObject;
-
-
-
-
-
- public class Startup extends UnicastRemoteObject implements Exitable {
-
- private static final long serialVersionUID = 1L;
-
- protected Startup() throws RemoteException {
- super();
- }
-
-
-
-
- public static void main(String[] args) {
- System.out.println("start");
- try {
- LocateRegistry.createRegistry(1099);
- Naming.rebind("main", new Startup());
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- catch (MalformedURLException e) {
- e.printStackTrace();
- }
-
- }
-
- public void exit() {
- System.out.println("savant end");
- System.exit(0);
- }
- }
Shutdown.java
java 代码
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.NotBoundException;
- import java.rmi.RemoteException;
-
- public class Shutdown {
-
-
-
-
- public static void main(String[] args) {
- try {
- Exitable e = (Exitable) Naming.lookup("main");
- e.exit();
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (RemoteException e) {
- e.printStackTrace();
- } catch (NotBoundException e) {
- e.printStackTrace();
- }
- }
- }
这个方法也不是一次就成功的,中间修改过多次,主要是最先写好的代码中有开篇提到的addShutdownHook方法,只是运行shundown时始
终不能关闭。郁闷很久后,依稀记得addShutdownHook方法是启用另一线程来关闭的,会不会是它产生的线程没有自我关闭呢?带着这个猜测,我
删掉了addShutdownHook方法的代码,结果运行shutdown成功!
按理这样成功了,就说明我的猜测是正确的,但其中有种说不来的想不通,还望!
分享到:
- 2007-09-24 22:50
- 浏览 2335
- 评论(3)
- 论坛回复 / 浏览 (3 / 3553)
- 查看更多
相关推荐
它使用`RMIClient`类或相似组件,通过RMI查找并获取服务端的远程对象引用,然后调用`submitFile()`方法将文件数据传输给服务端。这个过程通常涉及序列化和反序列化,因为Java对象不能直接在网络间传递,必须转换为可...
服务器端(server)会实现这个接口,并通过RMI注册服务,使得客户端(client)可以找到并调用这些远程方法。服务器端代码通常包括以下步骤: 1. 实现`MathOperations`接口。 2. 创建RMI注册表(Registry),这是...
"RMI"可能是“远程方法调用”(Remote Method Invocation)的缩写,暗示了该EA可能采用了先进的计算技术和数据处理方式。 在外汇交易中,EA的使用有以下几个显著优势: 1. **自动化交易**:EA可以自动执行买卖操作...
Java RMI(Remote Method Invocation,远程方法调用)是一种在分布式环境中进行对象间通信的技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法。在这个"RMI-remote-file-transfer.rar"项目...
MIPS架构的指令集是手册的重要组成部分,它详述了每条指令的功能、格式和使用方法。此外,手册可能还会涵盖与主流编译器(如GCC)的交互,包括特定的编译选项和优化策略,以获得最佳性能。 5. **调试和性能分析** ...
Java RMI(Remote Method Invocation,远程方法调用)是一种在分布式环境中实现对象间通信的技术,它允许一个Java对象调用另一个在不同Java虚拟机(JVM)上的对象的方法。RMI是Java EE平台中的核心组件之一,常用于...
RMI(Remote Method Invocation,远程方法调用)是一种Java平台上的技术,它允许开发者在不同JVM间的对象间进行方法调用,就像是本地方法调用一样简单。这项技术的出现极大地简化了分布式系统的开发工作,并成为了...
在Java世界中,远程方法调用(Remote Method Invocation, RMI)是一种机制,它允许一个对象的方法被另一个网络上的对象调用,实现了分布式计算。RMI-IIOP是RMI的一个扩展,它结合了RMI的功能与CORBA的IIOP(Internet...
- **远程接口**:这是定义远程方法的Java接口,需要使用`java.rmi.Remote`作为其父接口。 - **远程实现**:实现了远程接口的类,通常运行在服务器端,负责处理客户端的请求。 - **注册表(Registry)**:RMI的...
RMI-IIOP(Remote Method Invocation - Internet Inter-ORB Protocol)是一种在Java平台上实现分布式计算的技术,它结合了Java RMI(远程方法调用)和CORBA(Common Object Request Broker Architecture)的IIOP...
RMI的工作原理是通过Java序列化机制来传递对象,并使用Java的动态代理来实现方法调用的透明性。在【rmi-lite】中,可能会简化了注册表、安全性、异常处理等部分,以降低系统开销和复杂性,更适合小型或特定需求的...
在Java编程领域,RMI(Remote Method Invocation,远程方法调用)是一种强大的技术,用于构建分布式应用程序。RMI允许一个Java对象在某一个Java虚拟机(JVM)中调用另一个JVM中的对象的方法,实现了跨越网络的透明...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
Spring RMI服务是一种在Java平台上实现远程方法调用(Remote Method Invocation, RMI)的技术,它允许分布式系统中的不同组件通过网络进行通信。在Spring框架的支持下,我们可以更方便地将服务发布为RMI服务,使得...