Java注册成服务(Java Service Wrapper)

使用说明

一.下载Java Service Wrapper包

下载后解压该包(下载到/opt目录中),本次下载的是wrapper-linux-x86-64-3.5.51.tar.gz

tar -zxvf wrapper-linux-x86-64-3.5.51.tar.gz

二.新建项目目录(本次使用foss)

在新建的目录中创建以下4个目录:bin,conf,lib,logs

mkdir -p /opt/foss/bin

mkdir -p /opt/foss/conf

mkdir -p /opt/foss/lib

mkdir -p /opt/foss/logs

三.复制解压后的文件到新建的目录中

cp /opt/wrapper-linux-x86-64-3.5.51/src/bin/App.sh.in /opt/foss/bin

cp /opt/wrapper-linux-x86-64-3.5.51/src/bin/App.shconf.in /opt/foss/bin

cp /opt/wrapper-linux-x86-64-3.5.51/src/conf/wrapper.conf.in /opt/foss/conf

cp /opt/wrapper-linux-x86-64-3.5.51/bin/wrapper /opt/foss/bin

cp /opt/wrapper-linux-x86-64-3.5.51/lib/wrapper.jar /opt/foss/lib

cp /opt/wrapper-linux-x86-64-3.5.51/lib/libwrapper.so /opt/foss/lib

mv /opt/foss/bin/App.sh.in /opt/foss/bin/app.sh

mv /opt/foss/bin/App.shconf.in /opt/foss/bin/app.shconf

mv /opt/foss/conf/wrapper.conf.in /opt/foss/conf/wrapper.conf

四.目录结构

foss
├── bin
│   ├── app.sh
│   ├── app.shconf
│   └── wrapper
├── conf
│   └── wrapper.conf
├── lib
│   ├── libwrapper.so
│   ├── app-1.0.0.jar
│   └── wrapper.jar
└── logs
    └── wrapper.log

五.修正配置

1、修正bin/app.sh配置

APP_NAME="foss"
APP_LONG_NAME="My Foss Application"

2、修正bin/app.shconf配置

APP_NAME="foss"
APP_LONG_NAME="My Foss Application"

注:app.shconf不是必要,如果有该文件,则会优先使用该文件中的配置,如果没有则会使用app.sh中的配置(所以为了简单可以不要该文件,直接修改app.sh中的配置项)。

3、修正conf/wrapper.conf配置

# 配置java的完整路径
wrapper.java.command=java
# 启动方式有WrapperSimpleApp,WrapperStartStopApp,WrapperListener,WrapperJarApp四种
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# 添加自己应用的jar包
wrapper.java.classpath.2=../lib/app-1.0.0.jar
# Spring-Boot项目添加启动环境参数
wrapper.java.additional.1=-Dspring.profiles.active=local
# 是Spring-Boot项目时才配置(如果是其它可执行jar包,则不用配置)
wrapper.app.parameter.1=org.springframework.boot.loader.JarLauncher
# 以下三项是用户配置注册服务时使用
wrapper.name=foss
wrapper.displayname=foss
wrapper.description="Foss Application"

六.测试和启动项目

1、控制台运行

/opt/foss/bin/app.sh console

2、注册和删除服务

/opt/foss/bin/app.sh install

/opt/foss/bin/app.sh remove

2、启动和停止服务

/opt/foss/bin/app.sh start

/opt/foss/bin/app.sh stop

七.Java Service Wrapper包装服务的四种方式

1、WrapperSimpleApp

该方式就是上文的配置方法,没有代码侵入性,并且运行jar包也可以不用是可执行的jar包,配置如下

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/app-1.0.0.jar
wrapper.app.parameter.1=com.redtide.Boot/main

注:启动类后面不跟执行方法时,默认使用main方法

2、WrapperStartStopApp

该方式暂时还未使用,后续使用测试后再更新

3、WrapperListener

该方式需要程序中实现WrapperListener接口,对代码有侵入性,配置如下

wrapper.java.mainclass=com.redtide.Event
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/app-1.0.0.jar

注:Event.java的代码如下

package com.redtide;
import org.tanukisoftware.wrapper.WrapperListener;
import org.tanukisoftware.wrapper.WrapperManager;
public class Event implements WrapperListener{
    private MyApp myApp;

    private Event(){
    }

    public static void main(String[] args){
        WrapperManager.start(new Event(),args);
    }

    @Override
    public Integer start(String[] args){
        System.out.println("Event.start");
        for(String str : args){
            System.out.println("start==========" + str);
        }
        myApp = new MyApp(args);
        myApp.start();
        return null;
    }

    @Override
    public int stop(int exitCode){
        System.out.println("Event.stop = " + exitCode);
        myApp.stop();
        return exitCode;
    }

    @Override
    public void controlEvent(int event){
        System.out.println("Event.controlEvent = " + event);
        if((event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT) && (WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreUserLogoffs())){
            // Ignore
        }else{
            WrapperManager.stop(0);
        }
    }
}

注:MyApp.java的代码如下

package com.redtide;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MyApp{

    public MyApp(String[] args){
        System.out.println("MyApp.MyApp");
        for(String str : args){
            System.out.println("MyApp==========" + str);
        }
    }

    public void start(){
        System.out.println("MyApp.start");
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        Executors.newScheduledThreadPool(10).scheduleAtFixedRate(()->{
            System.out.println(LocalDateTime.now().format(df));
        },3,5,TimeUnit.SECONDS);
    }

    public void stop(){
        System.out.println("MyApp.stop");
    }
}

4、WrapperJarApp

该方法可以直接运行可执行的jar包,方便处理Spring-Boot之类的项目,配置如下

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.additional.1=-Dspring.profiles.active=local
wrapper.app.parameter.1=../lib/app-1.0.0.jar

注:wrapper.app.parameter.1后面直接跟可执行的jar包的相对路径,classpath后面则不需要再添加该jar包路径

你可能感兴趣的:(Java注册成服务(Java Service Wrapper))