`
cloud21
  • 浏览: 396284 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

关于Java钩子的使用

阅读更多
package test;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class Untitled1 {

	public Untitled1(){
		doShutDownWork();
		
	}
	private void doShutDownWork(){
		Runtime.getRuntime().addShutdownHook(new Thread()
		{
			public void run(){
				try{
					FileWriter fw=new FileWriter("c:\\t.log");
					System.out.println("Im going to end");
					fw.write("The application ended! "+(new Date()).toString());
					fw.close();
				}catch(IOException ex){
					
				}
				
			}
			
		});
		
	}
	
	public static void main(String[] args){
		Untitled1 untitled11=new Untitled1();
		long s=System.currentTimeMillis();
		for(int i=0;i<1000000000;i++){
			
		}
		long se=System.currentTimeMillis();
		System.out.println(se-s);
		
	}
}


但是我还是不知道,tomcat是如何退出的,请教各位提提意见,一直想知道。
1
0
分享到:
评论
2 楼 xiegqooo 2012-12-21  
简单的关闭 tomcat
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ShutdownService {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Socket socket = new Socket("127.0.0.1", 8005);
			OutputStream stream = socket.getOutputStream();
			String shutdown = "SHUTDOWN";
			for (int i = 0; i < shutdown.length(); i++)
				stream.write(shutdown.charAt(i));
			stream.flush();
			stream.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

1 楼 xiegqooo 2012-12-21  
下面是 tomcat 等待关闭的源代码  。 如何有退出 tomcat 。应该会明白的 。


org.apache.catalina.core.StandardServer

int port = 8005;
ServerSocket awaitSocket;

    /**
     * Wait until a proper shutdown command is received, then return.
     * This keeps the main thread alive - the thread pool listening for http 
     * connections is daemon threads.
     */
    public void await() {
        // Negative values - don't wait on port - tomcat is embedded or we just don't like ports
        if( port == -2 ) {
            // undocumented yet - for embedding apps that are around, alive.
            return;
        }
        if( port==-1 ) {
            try {
                awaitThread = Thread.currentThread();
                while(!stopAwait) {
                    try {
                        Thread.sleep( 10000 );
                    } catch( InterruptedException ex ) {
                        // continue and check the flag
                    }
                }
            } finally {
                awaitThread = null;
            }
            return;
        }
        
        // Set up a server socket to wait on
        try {
            awaitSocket =
                new ServerSocket(port, 1,
                                 InetAddress.getByName("localhost"));
        } catch (IOException e) {
            log.error("StandardServer.await: create[" + port
                               + "]: ", e);
            return;
        }

        try {
            awaitThread = Thread.currentThread();

            // Loop waiting for a connection and a valid command
            while (!stopAwait) {
                ServerSocket serverSocket = awaitSocket;
                if (serverSocket == null) {
                    break;
                }
    
                // Wait for the next connection
                Socket socket = null;
                StringBuilder command = new StringBuilder();
                try {
                    InputStream stream = null;
                    try {
                        socket = serverSocket.accept();
                        socket.setSoTimeout(10 * 1000);  // Ten seconds
                        stream = socket.getInputStream();
                    } catch (AccessControlException ace) {
                        log.warn("StandardServer.accept security exception: "
                                           + ace.getMessage(), ace);
                        continue;
                    } catch (IOException e) {
                        if (stopAwait) {
                            // Wait was aborted with socket.close()
                            break;
                        }
                        log.error("StandardServer.await: accept: ", e);
                        break;
                    }

                    // Read a set of characters from the socket
                    int expected = 1024; // Cut off to avoid DoS attack
                    while (expected < shutdown.length()) {
                        if (random == null)
                            random = new Random();
                        expected += (random.nextInt() % 1024);
                    }
                    while (expected > 0) {
                        int ch = -1;
                        try {
                            ch = stream.read();
                        } catch (IOException e) {
                            log.warn("StandardServer.await: read: ", e);
                            ch = -1;
                        }
                        if (ch < 32)  // Control character or EOF terminates loop
                            break;
                        command.append((char) ch);
                        expected--;
                    }
                } finally {
                    // Close the socket now that we are done with it
                    try {
                        if (socket != null) {
                            socket.close();
                        }
                    } catch (IOException e) {
                        // Ignore
                    }
                }

                // Match against our command string
                boolean match = command.toString().equals(shutdown);
                if (match) {
                    break;
                } else
                    log.warn("StandardServer.await: Invalid command '" +
                                       command.toString() + "' received");
            }
        } finally {
            ServerSocket serverSocket = awaitSocket;
            awaitThread = null;
            awaitSocket = null;

            // Close the server socket and return
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    // Ignore
                }
            }
        }
    }

相关推荐

    java钩子实现源码

    Java钩子(Hook)机制是Java虚拟机(JVM)提供的一种高级机制,允许程序员在特定的事件发生时插入自定义的行为。这个机制基于Java的动态代理和反射API,使得我们可以在程序运行时对某些行为进行拦截和处理。在Java中...

    java鼠标钩子实现

    在Java中,实现鼠标钩子通常涉及到使用Java的`java.awt.MouseInfo`和`java.awt.event.MouseEvent`类,以及可能的`java.lang.reflect.Method`用于钩入系统级别的事件处理。 首先,`MouseInfo`类提供了获取鼠标状态的...

    jnativehook_java键盘钩子_hookapi_jnativehook_

    标题中的“jnativehook_java键盘钩子_hookapi_jnativehook”指的是Java中使用JNativeHook库来实现系统级键盘钩子的功能。JNativeHook是一个开源的Java库,它允许开发者在本地平台上设置全局键盘和鼠标事件监听器,而...

    Java钩子方法概念原理详解

    主要介绍了Java钩子方法概念原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java的鼠标键盘钩子程序swt实现

    在"java的鼠标键盘钩子程序swt实现"这个主题中,我们将探讨如何使用SWT来创建这样的钩子程序。 SWT是Eclipse项目的一部分,提供了与Java标准库AWT和Swing不同的GUI组件和功能。它直接与操作系统底层交互,因此可以...

    键盘钩子实例(使用DLL和hook)

    在这个实例中,我们关注的是键盘钩子,它涉及到使用动态链接库(DLL)来实现。下面将详细介绍这个过程。 首先,我们要理解动态链接库(DLL)。DLL是Windows操作系统提供的一种代码共享机制,它包含可由多个应用程序...

    java实现的鼠标键盘钩子程序

    我在jBuilder里面用swing实现的该程序,其实很简单,就是调用了里面库文件的两个监听事件,当程序失去焦点以后仍然可以显示出当前鼠标的坐标。之所以上传是因为不少人可能对swt extension并不熟悉,导致自己用JNI...

    JAVA实现键盘钩子的源代码

    仅用JAVA实现全局键盘钩子的功能,很好很强大,学习下

    java鼠标钩子 运行程序 显示鼠标位置

    java鼠标钩子 运行程序 显示鼠标位置

    Java写游戏脚本钩子问题.docx

    标题“Java写游戏脚本钩子问题.docx”暗示了一个关于使用Java进行游戏脚本开发时遇到的特定问题,可能是关于在游戏中实现钩子(hook)机制的问题。钩子是一种编程技术,它允许开发者插入自定义代码到现有代码的特...

    Java写游戏脚本钩子问题.pdf

    标题"Java写游戏脚本钩子问题.pdf"暗示了本文将探讨如何使用Java进行游戏脚本开发时遇到的钩子(hook)技术问题。钩子在编程中通常指的是一个函数或方法,用于拦截和处理特定事件或行为,尤其在游戏开发中,钩子常...

    java源码包---java 源码 大量 实例

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA实现按键精灵效果

    分析和学习这个程序可以帮助你更好地理解如何在Java中使用JNA和`swt.win32.extension`实现全局钩子,从而达到按键精灵的效果。 总的来说,通过JNA和`swt.win32.extension`,Java程序员能够跨越Java和C之间的障碍,...

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    java-git-pre-commit-hook:用于Java Java EE项目的带有正则表达式的简单预提交钩子

    描述中提到的“一个简单的(愚蠢的)带有regex的pre-commit挂钩”,意味着这个预提交钩子使用了正则表达式(regex)来执行特定的检查。正则表达式是一种强大的文本处理工具,能用于匹配、查找、替换等操作。在这个...

    Gitlab的Hooks(钩子)做Push代码检测1

    CheckStyle 是一个静态代码分析工具,可以检测 Java 代码中的错误、坏味道和不良实践。我们可以将 CheckStyle 的 jar 文件和配置文件复制到 custom_hooks 目录下,然后在 pre-receive 钩子脚本中调用 CheckStyle ...

    Java 剪贴板演示程序-完成复制粘贴功能.rar

    此外,标签"Java源码-系统相关"表明这个程序可能涉及到与操作系统交互的其他方面,比如可能利用Java的`System`类进行系统级别的操作,或者使用`java.io`包进行文件输入输出。尽管具体实现未在描述中详述,但这些都是...

    jna test【鼠标 键盘钩子】

    **文件名解析:** "jna_test" 可能是一个项目文件夹或者测试文件,其中可能包含了使用JNA进行键盘鼠标钩子实现的Java代码。 **详细知识点:** 1. **Java Native Access (JNA)**:JNA是一种在Java中调用本地函数的...

    Linux钩子配置(SVN)

    4. **Java项目中的SVN钩子应用** - SVN与Java项目的集成 - 使用JRebel进行热部署 5. **常见问题及解决方案** #### SVN (Subversion) 简介 Subversion(SVN)是一种开源版本控制系统,用于管理软件项目的源代码。它...

Global site tag (gtag.js) - Google Analytics