• java编写service详细笔记


    java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了) 


    目标效果(命令行启动服务):
    service xxxxd start #启动服务 
    service xxxxd stop  #停止服务


    详细步骤
    一、编译并安装jsvc
        官网 https://commons.apache.org/daemon/
        1)建立目录
          cd /
          mkdir jsvc
        2)下载jsvc源码
          wget https://mirrors.tuna.tsinghua.edu.cn/apache//commons/daemon/source/commons-daemon-1.0.15-src.tar.gz
        3)解压源码
          tar zxvf commons-daemon-1.0.15-src.tar.gz
        4)编译源码
          编译器为了省事,先给目录下所有文件设置可执行权限
          chmod -R 777 *

          cd /jsvc/commons-daemon-1.0.15-src/src/native/unix
          ./support/buildconf.sh
          ./configure --with-java=/opt/jdk #注 /opt/jdk 是我的java安装目录
          make #编译
        5)编译后
         会在 /jsvc/commons-daemon-1.0.15-src/src/native/unix 生成 可执行文件jsvc
         设置一下执行权限
         chmod 777 /jsvc/commons-daemon-1.0.15-src/src/native/unix/jsvc
    二、实战编写一个小小的javasocket服务,代码如下:
        1)test_service.java
        ========================================================================
    package com.xiaobaijiuxing.jsvc;


    import org.apache.commons.daemon.Daemon;
    import org.apache.commons.daemon.DaemonContext;
    import org.apache.commons.daemon.DaemonInitException;


    /** 
    * @date 2017-5-2 
    * @author 小白救星 
    */
    public class test_service implements Daemon {
    public static boolean isstop = false;
       public static void main(String args[]) { 
    System.out.println("Hello World2!"); 
       }
       /* (non-Javadoc) 
        * @see org.apache.commons.daemon.Daemon#destroy() 
        */
       @Override
       public void destroy() {
    // TODO Auto-generated method stub  
    System.out.println("JsvcTest destory method...");
       }


       /* (non-Javadoc) 
        * @see org.apache.commons.daemon.Daemon#init(org.apache.commons.daemon.DaemonContext) 
        */
       @Override
       public void init(DaemonContext ctx) throws DaemonInitException, Exception {
    // TODO Auto-generated method stub  
    System.out.println("JsvcTest init method..." + ctx.toString());
       }


       /* (non-Javadoc) 
        * @see org.apache.commons.daemon.Daemon#start() 
        */
       @Override
       public void start() throws Exception {
    // TODO Auto-generated method stub  
    int i =0;
    //while (!isstop)
    //{
    Server server = new Server();
    server.init();
    System.out.println("JsvcTest start method..." + i);
    i = i +1;
    //}
       }


       /* (non-Javadoc) 
        * @see org.apache.commons.daemon.Daemon#stop() 
        */
       @Override
       public void stop() throws Exception {
    // TODO Auto-generated method stub 
    isstop = true;
    System.out.println("JsvcTest stop method...");
       }


    }
        ========================================================================
        2)Server.java
        ========================================================================
    package com.xiaobaijiuxing.jsvc; 
      
    import java.io.BufferedReader;  
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.InputStreamReader;  
    import java.net.ServerSocket;  
    import java.net.Socket;  
     
    public class Server {  
       public static final int PORT = 12345;//监听的端口号     
         
       //public static void main(String[] args) {    
       //    System.out.println("服务器启动... ");    
       //    Server server = new Server();    
       //    server.init();    
       //}    
       
       public void init() {  
    System.out.println("服务器启动... "); 
    try {    
       ServerSocket serverSocket = new ServerSocket(PORT);    
       //while (true) {    
    // 一旦有堵塞, 则表示服务器与客户端获得了连接    
    Socket client = serverSocket.accept();    
    // 处理这次连接    
    new HandlerThread(client);    
       //}    
    } catch (Exception e) {    
       System.out.println("服务器异常: " + e.getMessage());    
    }    
       }    
       
       private class HandlerThread implements Runnable {    
    private Socket socket;    
    public HandlerThread(Socket client) {    
       socket = client;    
       new Thread(this).start();    
    }    
       
    public void run() {    
       try {    
    // 读取客户端数据    
    DataInputStream input = new DataInputStream(socket.getInputStream());  
    String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException  
    // 处理客户端数据    
    System.out.println("客户端发过来的内容:" + clientInputStr);    
       
    // 向客户端回复信息    
    DataOutputStream out = new DataOutputStream(socket.getOutputStream());    
    System.out.print("请输入: ");    
    // 发送键盘输入的一行    
    String s = new BufferedReader(new InputStreamReader(System.in)).readLine();    
    out.writeUTF(s);    
     
    out.close();    
    input.close();    
       } catch (Exception e) {    
    System.out.println("服务器 run 异常: " + e.getMessage());    
       } finally {    
    if (socket != null) {    
       try {    
    socket.close();    
       } catch (Exception e) {    
    socket = null;    
    System.out.println("服务端 finally 异常:" + e.getMessage());    
       }    
    }    
       }   
    }    
       }    

        ========================================================================
    三、将我们的java代码打包到test_service.jar
    我采用ant打包,因为我感觉ant最简单,写代码只要用好了EditPlus+ant就可以,不需要其它开发工具
        1)ant编译配置文件build.xml
        ========================================================================
        <?xml version="1.0" encoding="UTF-8" ?>
    <project name="test_service" default="run" basedir=".">
    <property name="src" value="src"/>
    <property name="dest" value="classes"/>
    <property name="doc.dir" value="doc"/>
    <property name="test_services_jar" value="test_service.jar"/>
    <property name="main.class" value="com.xiaobaijiuxing.jsvc.test_service"/>
       <path id="lib_classpath">
           <fileset dir="lib/">
               <include name="*.jar"/>
           </fileset>  
       </path>
    <target name="init">
      <mkdir dir="${dest}"/>
    </target>
    <target name="compile" depends="init">
      <javac encoding="utf-8" srcdir="${src}" destdir="${dest}" includeantruntime="on">
        <classpath refid="lib_classpath"/>
      </javac>


    </target>
    <target name="build" depends="compile">
      <jar encoding="utf-8" jarfile="${test_services_jar}" basedir="${dest}">
      <manifest>
    <!--<attribute name="Main-Class" value="${main.class}"/>-->
    <attribute name="Class-Path" value="lib/commons-daemon-1.0.15.jar"/>
      </manifest>
      </jar>
    </target>
    <target name="run" depends="clean,build">
    </target>
    <target name="clean">
      <delete dir="${dest}" />
      <delete file="test_services_jar" />
    </target>
    <target name="rerun" depends="clean,run">
      <ant target="clean" />
      <ant target="run" />
    </target>
    <target name="createdoc">
         <delete dir="${doc.dir}" />
         <mkdir dir="${doc.dir}"/>
         <javadoc destdir="${doc.dir}" encoding="UTF-8" docencoding="UTF-8">
          <packageset dir="${src}">
           <include name="**"/>
          </packageset>
         </javadoc>
        </target>
    </project>
        ========================================================================
        2)编译生成test_service.jar包
        命令行运行 ant回车即可
        3)建立目录
        mkdir /jsvc/commons-daemon-1.0.15-src/app
        mkdir /jsvc/commons-daemon-1.0.15-src/log
        mkdir /jsvc/commons-daemon-1.0.15-src/tmp
        chmod -R 777  *
        4)将编译出来的jar包及要用到的lib目录拷贝到 /jsvc/commons-daemon-1.0.15-src/app 目录下
        app目录下是 test_service.jar
        app/lib目录下是 commons-daemon-1.0.15.jar
    四、编写linux centos7.2 service 脚本并运行
        1)cd /etc/init.d/
        2)vi testserviced #内容如下
        ========================================================================
    #!/bin/sh


    RETVAL=0
    prog="jsvc"
    JAVA_HOME=/opt/jdk
    APP_HOME=/jsvc/commons-daemon-1.0.15-src/app


    #jsvc所在的目录  
    DAEMON_HOME=/jsvc/commons-daemon-1.0.15-src/src/native/unix


    APP_USER=root
    TMP_DIR=/jsvc/commons-daemon-1.0.15-src/app/tmp
    PID=/jsvc/commons-daemon-1.0.15-src/app/testserviced.pid
    CLASSPATH=/jsvc/commons-daemon-1.0.15-src/app/test_service.jar:/jsvc/commons-daemon-1.0.15-src/app/lib/commons-daemon-1.0.15.jar


    case "$1" in


    start)
    #echo $DAEMON_HOME
    # Start Serivce
    $DAEMON_HOME/jsvc -user $APP_USER -home $JAVA_HOME -Djava.io.tmpdir=$TMP_DIR -wait 5000 -pidfile $PID -outfile $APP_HOME/log/jsvc.out -errfile '&1' -cp $CLASSPATH com.jason.jsvc.test_service &


    # To get a verbose JVM  
     
    #-verbose  
     
    # To get a debug of jsvc.  
     
    #-debug  
     
    exit $?
     
    ;;


     


    stop)


    #  
     
    # Stop Serivce  
     
    #  
     
    #$DAEMON_HOME/jsvc -stop -pidfile $PID com.jason.jsvc.test_service
     
    exit $?


    ;;




    *)
     
    echo "Usage service testserviced start/stop"
     
    exit 1;;
     
    esac
    :wq #保存
        ========================================================================
        3)添加centos系统服务
    chmod 777 /etc/init.d/testserviced
    chkconfig --add testserviced
        4)启动和关闭服务
        service testserviced start

        查看我们服务启动后的socket服务端口是否启动了监听

        lsof -i:12345

        返回结果:

    [root@xiaobaijiuxing ~]# lsof -i:12345
    [root@xiaobaijiuxing ~]# service testserviced start
    [root@xiaobaijiuxing ~]# lsof -i:12345
    COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    jsvc    171926 root    9u  IPv6 5672748      0t0  TCP *:italk (LISTEN)
        service testserviced stop
    五、大功告成
       作者:小白救星 原创,未经许可可以随意转发

  • 相关阅读:
    JQuery学习之(一)概述
    Ajax:拥抱JSON,让XML走开(转)
    .Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#)
    Nunit使用手记
    ajax常见问题总结
    单例模式代码
    asp.net网站url伪静态重写技术的实现
    WCF 基础加开发简介
    ExtJS调用WCF实现JSON传递
    lock 语句(C# 参考)
  • 原文地址:https://www.cnblogs.com/bdccloudy/p/7665213.html
Copyright © 2020-2023  润新知