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("服务器启动...\n");    

   //    Server server = new Server();    

   //    server.init();    

   //}    

   

   public void init() {  

System.out.println("服务器启动...\n"); 

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("请输入:\t");    

// 发送键盘输入的一行    

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

五、大功告成

   作者:小白救星 原创,未经许可可以随意转发

java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)的更多相关文章

  1. 《安卓网络编程》之第七篇 java编写Service程序

    import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net. ...

  2. 实战WEB 服务器(JAVA编写WEB服务器)

    实战WEB 服务器(JAVA编写WEB服务器) 标签: web服务服务器javawebsockethttp服务器 2010-04-21 17:09 11631人阅读 评论(24) 收藏 举报  分类: ...

  3. Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果

    Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果 一.详细说明及代码 tc.py =============================================== ...

  4. Java虚拟机性能监控与调优实战

    From:  https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...

  5. linux配置java环境变量(详细)

    linux配置java环境变量(详细) 本文完全引用自: http://www.cnblogs.com/samcn/archive/2011/03/16/1986248.html 一. 解压安装jdk ...

  6. delphi调用java编写的webservice

    delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{    private stati ...

  7. 15套java架构师大型分布式综合项目实战、千万高并发-视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  8. RHEL7.0 Docker离线安装以及实战笔记

    1.概述 最近在琢磨一个事--在RHEL 7.0系统上离线安装使用Docker.然后配置JAVAEE环境,发布Web服务.在网上查了资料,大多数是在线安装的,其他的要么是环境不同,要么资料包找不到了. ...

  9. 机器学习实战笔记-k-近邻算法

    机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...

随机推荐

  1. IntelliJ IDEA 2017版 导入项目项目名称为红色

    1.导入的项目全部是红色的,原因是版本控制问题,所以修改如下:(File--->settings) 2.找到如图位置的字样,选中当前项目,选择铅笔位置 选择铅笔 弹出对话框(默认选择的是proj ...

  2. LA 4329 Ping pong (树状数组)

    题意:从左到右给你n个不同的数值,让你找出三个数值满足中间的数值在两边的数值之间的个数. 析:题意还是比较好理解的,关键是怎么求数量,首先我们分解一下只有两种情况,一个是左边<中间<右边, ...

  3. 用Git将项目发布在GitHub里

    转载自http://blog.csdn.net/u011572517/article/details/50537407,个人加了一些注意事项和解释. githud是一个程序员以后成长都会使用到的,先不 ...

  4. ArcGIS Desktop Python add-ins 共享和安装插件

    1)   共享和安装插件 共享Python插件的关键是.esriaddin文件;为了获取该插件功能,其他用户只要在本机执行安装操作或通过网络引用该插件就可以. ArcGIS插件安装工具 当用户双击一个 ...

  5. hbase使用MapReduce操作2(微博表实现)

    package com.yjsj.weibo; import java.io.IOException; import java.util.ArrayList; import java.util.Ite ...

  6. 页面中的删除确认(ajax)、输入框中确认信息是否可用(ajax)的jquery代码

    1.页面中的删除确认(ajax) <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...

  7. Android-Xml,PullParser,解析

    在上一篇博客,Android-XML格式描述,介绍来XML在Android中的格式: 解析persons.xml文件内容: <?xml version="1.0" encod ...

  8. Mina的ssl加密

    前面写的Mina的示例,都是可以通过telnet登录的,并且可以相互交互. 现在采用ssl加密的方式,对建立连接时,进行加密连接.这样,双方只有统一的加密,然后才可以连接. 密钥的生成之前有说过,里面 ...

  9. WPF Out Of Memory

    起因 程序发布后,运行突然奔溃报Out of Memory,查看日志发现如下类似错误(以下堆栈信息来之网络): System.OutOfMemoryException: Insufficient me ...

  10. ASP.NET MVC+Redis (准备工作)

    今天准备更新这个项目的第二篇博客.有一点需要说明的是之前觉得用的是Asp.net的WebPage,经过查看微软的官方文档还有相关的博客,相比较而言使用起来需要安装一个自动工具WebMatrix可以很快 ...