Java Service Wrapper

Java Service Wrapper



参考文档:
http://wrapper.tanukisoftware.com/doc/english/integrate-start-stop-nix.html
目录
Java Service Wrapper使用总结
1.概述
2.Java Service Wrapper目录结构
{WRAPPER_HOME}
3.使用WrapperSimpleApp进行集成
3.1        ams-collector-verify目录结构
3.2        复制Java Service Wrapper文件到应用程序
3.3        编辑sh.script.in文件
(1)重命名sh.script.in
(2)赋执行权限
(3)编辑collector-verify属性
3.4编辑wrapper.conf.in文件
(1)重命名wrapper.conf.in
(2)定位启动应用的Java命令
(3)编辑wrapper.conf属性
4.使用WrapperStartStopApp进行集成
4.1Tomcat的目录结构
4.2复制Java Service Wrapper文件到Tomcat
4.3        编辑sh.script.in文件
(1)重命名sh.script.in
(2)赋执行权限
(3)编辑tomcat属性
4.4编辑wrapper.conf.in文件
(1)重命名wrapper.conf.in
(2)定位启动及关闭tomcat的Java命令
(3)编辑wrapper.conf属性
5.安装及卸载服务
5.1安装服务
5.2卸载服务
6.配置对内存溢出进行监控




1.概述
        Java Service Wrapper可为应用程序提供以下功能:
        (1)把应用安装为Windows服务或Linux守护进程;
        (2)监测JVM运行情况,对于程序原因或内存溢出导致的虚拟机崩溃实现自动重启;
        (3)记录运行日志;

2.Java Service Wrapper目录结构
        以下列出需要复制到应用的文件:
        {WRAPPER_HOME}
                 --/bin/wrapper
                 -- /src/bin/sh.script.in
                 --/src/conf/wrapper.conf.in
                 --/lib/libwrapper.so
                 --/lib/wrapper.jar

        Java Service Wrapper与应用集成时,需要把上述文件复制到应用中相应的目录,详情请见以下的两个集成。

3.使用WrapperSimpleApp进行集成
        WrapperSimpleApp是Java Service Wrapper中最简单的集成方式,在该例子中,我们把它集成到我们的ams-collector-verify抓拍程序中。
     3.1     ams-collector-verify目录结构
        {ams-collector-verify}
                  --/bin
                  --/etc
                  --/lib
                  --logs

     3.2     复制Java Service Wrapper文件到应用程序
        (1)复制/bin/wrapper到应用的bin目录;
        (2)复制/src/bin/sh.script.in到应用的bin目录;
        (5)复制/src/conf/wrapper.conf.in到应用的etc目录下;
        (6)复制/lib/libwrapper.so到应用的lib目录;
        (7)复制/lib/wrapper.jar到应用的lib目录;

     3.3     编辑sh.script.in文件
                  该文件可以看作是入口点,启动应用也是使用该脚本,按以下步骤进行操作:
          (1)重命名sh.script.in
                           mv sh.script.in collector-verify;

          (2)赋执行权限
                           例如在Linux下:chmod 755 collector-verify;

           (3)编辑collector-verify属性
                           #应用缩写
                           APP_NAME="collector-verify"
                           #应用全名
                           APP_LONG_NAME="ams-collector-verify"
                           #wrapper配置文件所在位置
                           WRAPPER_CONF="../etc/wrapper.conf"

   3.4编辑wrapper.conf.in文件
          所有java service wrapper配置项均在此设置,按以下步骤进行设置:
       (1)重命名wrapper.conf.in
                        mv wrapper.conf.in wrapper.conf

       (2)定位启动应用的Java命令

                        当我们知道应用是如何启动的,我们才能将启动所需的参数,classpath及依赖包写入我们的wrapper.conf中;
                        在ams-collector-verify应用中,启动应用的java程序如下:
                        /usr/java/jdk1.6.0_13/jre/bin/java -classpath
                        /usr/local/ams-collector-verify/bin/commons-launcher.jar:
                        /usr/local/ams-collector-verify/etc:
                        /usr/local/ams-collector-verify/lib/ams-collector-verify-1.0.jar:
                        ...
                        com.ce.collector.app.SnapApp

                        从上面的命令可以看到,它包含两方面的信息:
                        1)classpath参数加载了lib目录下的所有jar包;
                        2)com.ce.collector.appSnapApp类是程序的入口点。

       (3)编辑wrapper.conf属性
                        #设置JAVA_HOME
                        set.JAVA_HOME=/usr/java/jdk1.6.0_13
                        #动态链接库放置在JAVA_HOME/bin下,设置LD_LIBRARY_PATH变量
                        set.LD_LIBRARY_PATH=%JAVA_HOME%/bin:%LD_LIBRARY_PATH%
                        #设置java命令路径
                        wrapper.java.command=%JAVA_HOME%/bin/java
                        #设置classpath路径,设置的内容包括wrapper.jar,应用配置文件所在的路径,应启动时classpath包含的所有信息
                        wrapper.java.classpath.1=../lib/wrapper.jar
                        wrapper.java.classpath.2=../etc
                        wrapper.java.classpath.3=../lib/ams-collector-verify-1.0.jar
                        ...
                        #wrapper.DLL及libwrapper.so所在的位置
                        wrapper.java.library.path.1=../lib
                        #应用程序启动的类(带有main方法的类)
                        wrapper.app.parameter.1=com.ce.collector.app.SnapApp
                        #设置控制台的名称
                        wrapper.console.title=ams-collector-verify
                        #服务名称
                        wrapper.name=ams-collector-verify
                        #服务的显示名称
                        wrapper.displayname=ams-collector-verify
                        #服务的描述信息
                        wrapper.description=collector-verify for ams system

                        配置完成后,回到应用的bin目录下,试试利用collectory-verify脚本启动应用
                        [root@suhao03 etc]# cd ../bin
                        [root@suhao03 bin]# ./collector-verify start
                        Starting ams-collector-verify...
                        Waiting for ams-collector-verify....
                        running: PID:8445

                        可以到logs目录进一步查看应用启动的情况
                        [root@suhao03 bin]# cd ../logs/
                        [root@suhao03 logs]# tail -f wrapper.log

                        停止应用可执行以下命令
                        [root@suhao03 bin]# ./collector-verify stop

4.使用WrapperStartStopApp进行集成
        Tomcat应用服务器在启动时会开启一个服务端socket等待连接,而关闭时则通过连接触发应用的停止,类似这种应用则通过WrapperStartStopApp实现。
     4.1Tomcat的目录结构
                  {tomcat_home}
                           --/bin
                           --/conf
                           --/logs
                           --/temp
                           --/webapps
                           --/work

     4.2复制Java Service Wrapper文件到Tomcat
        (1)复制/bin/wrapper到Tomcat的bin目录;
        (2)复制/src/bin/sh.script.in到Tomcat的bin目录;
        (5)复制/src/conf/wrapper.conf.in到Tomcat的etc目录下;
        (6)复制/lib/libwrapper.so到Tomcat的lib目录;
        (7)复制/lib/wrapper.jar到Tomcat的lib目录;

     4.3     编辑sh.script.in文件
                  该文件可以看作是入口点,启动应用也是使用该脚本,按以下步骤进行操作:
          (1)重命名sh.script.in
                           mv sh.script.in tomcat;

          (2)赋执行权限
                           例如在Linux下:chmod 755 tomcat;

          (3)编辑tomcat属性
                           #应用缩写
                           APP_NAME="tomcat"
                           #应用全名
                           APP_LONG_NAME="Tomcat Application Server"

   4.4编辑wrapper.conf.in文件
          所有java service wrapper配置项均在此设置,按以下步骤进行设置:
       (1)重命名wrapper.conf.in
                        mv wrapper.conf.in wrapper.conf

       (2)定位启动及关闭tomcat的Java命令
                        打开bin/catalina.sh文件,分别找到启动及关闭的shell脚本,把shell脚本的内容echo到控制台,看看它是如何启动及关闭tomcat的:
                        [run]
                        echo "$_RUNJAVA" $JAVA_OPTS "$LOGGING_CONFIG" $CATALINA_OPTS \
     -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
     -Dcatalina.base="$CATALINA_BASE" \
     -Dcatalina.home="$CATALINA_HOME" \
     -Djava.io.tmpdir="$CATALINA_TMPDIR" \
     org.apache.catalina.startup.Bootstrap "$@" start

                        echo的结果为:
                        /usr/java/jdk1.6.0_13/bin/java
                        -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
        -Djava.util.logging.config.file=/usr/local/apache-tomcat-6.0.18/conf/logging.properties
        -Djava.endorsed.dirs=/usr/local/apache-tomcat-6.0.18/endorsed          -classpath :/usr/local/apache-tomcat-6.0.18/bin/bootstrap.jar
        -Dcatalina.base=/usr/local/apache-tomcat-6.0.18
        -Dcatalina.home=/usr/local/apache-tomcat-6.0.18
        -Djava.io.tmpdir=/usr/local/apache-tomcat-6.0.18/temp
        org.apache.catalina.startup.Bootstrap start

                        [stop]
                         echo "$_RUNJAVA" $JAVA_OPTS \
   -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
   -Dcatalina.base="$CATALINA_BASE" \
   -Dcatalina.home="$CATALINA_HOME" \
   -Djava.io.tmpdir="$CATALINA_TMPDIR" \
   org.apache.catalina.startup.Bootstrap "$@" stop

                        echo的结果为:
                        /usr/java/jdk1.6.0_13/bin/java
                        -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
                        -Djava.endorsed.dirs=/usr/local/apache-tomcat-6.0.18/endorsed                            -classpath :/usr/local/apache-tomcat-6.0.18/bin/bootstrap.jar
        -Dcatalina.base=/usr/local/apache-tomcat-6.0.18
        -Dcatalina.home=/usr/local/apache-tomcat-6.0.18
        -Djava.io.tmpdir=/usr/local/apache-tomcat-6.0.18/temp
        org.apache.catalina.startup.Bootstrap stop

       (3)编辑wrapper.conf属性
                        #设置JAVA_HOME
                        set.JAVA_HOME=/usr/java/jdk1.6.0_13
                        #设置CATALINA_HOME
                        set.CATALINA_HOME=/usr/local/apache-tomcat-6.0.18
                        #设置CATALINA_BASE
                        set.CATALINA_BASE=/usr/local/apache-tomcat-6.0.18

                        #设置JAVA执行命令
                        wrapper.java.command=%JAVA_HOME%/bin/java

                        #设置classpath
                        wrapper.java.classpath.1=%CATALINA_BASE%/lib/wrapper.jar
                        wrapper.java.classpath.2=%CATALINA_HOME%/bin/bootstrap.jar

                        #设置lib
                        wrapper.java.library.path.1=%CATALINA_BASE%/lib

                        #添加tomcat启动时所在命令设置的-D参数
                        wrapper.java.additional.1=
                        -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
                        wrapper.java.additional.2=
                        -Djava.util.logging.config.file=%CATALINA_BASE%/conf/logging.properties
                        wrapper.java.additional.3=
                        -Djava.endorsed.dirs=%CATALINA_BASE%/endorsed
                        wrapper.java.additional.4=
                        -Dcatalina.base=%CATALINA_BASE%
                        wrapper.java.additional.5=
                        -Dcatalina.home=%CATALINA_HOME%
                        wrapper.java.additional.6=-Djava.io.tmpdir=%CATALINA_BASE%/temp

                        #添加应用参数
                        wrapper.app.parameter.1=org.apache.catalina.startup.Bootstrap
                        wrapper.app.parameter.2=1
                        wrapper.app.parameter.3=start
                        wrapper.app.parameter.4=org.apache.catalina.startup.Bootstrap
                        wrapper.app.parameter.5=TRUE
                        wrapper.app.parameter.6=1
                        wrapper.app.parameter.7=stop

                        #日志文件所在位置
                        wrapper.logfile=%CATALINA_BASE%/logs/wrapper.log

                        #设置控制台的名称
                        wrapper.console.title=tomcat
                        #服务名称
                        wrapper.name=tomcat
                        #服务的显示名称
                        wrapper.displayname=tomcat application server
                        #服务的描述信息
                        wrapper.description=tomcat for ams system

                        配置完成后,回到tomcat的bin目录下,试试用tomcat脚本启动服务器
                        [root@suhao03 etc]# cd ../bin
                        [root@suhao03 bin]# ./tomcat start
                        Starting tomcat...
                        Waiting for tomcat....
                        running: PID:8445

                        可以到logs目录进一步查看tomcat启动的情况
                        [root@suhao03 bin]# cd ../logs/
                        [root@suhao03 logs]# tail -f wrapper.log

                        停止tomcat可执行以下命令
                        [root@suhao03 bin]# ./tomcat stop



5.安装及卸载服务
        安装及卸载服务可以通过脚本的install及remove参数完成,想查看service wrapper提供的参数,可键入命令:
        [root@suhao03 bin]# ./collector-verify -help
        Usage: ./collector-verify [ console | start | stop | restart | condrestart | status | install | remove | dump ]
        Commands:
          console      Launch in the current console.
          start        Start in the background as a daemon process.
          stop         Stop if running as a daemon or in another console.
          restart      Stop if running and then start.
          condrestart  Restart only if already running.
          status       Query the current status.
          install      Install to start automatically when system boots.
          remove       Uninstall.
          dump         Request a Java thread dump if running.


     5.1安装服务
        [root@suhao03 bin] ./collectory-verify install

        可以到/etc/rc.d/init.d目录看到增加了以下的符号链接:
        collector-verify -> /usr/local/ams-collector-verify/bin/./collector-verify

     5.2卸载服务
        [root@suhao03 bin] ./collectory-verify remove


6.配置对内存溢出进行监控
        在某些情况下,当应用出现outofmemory时,我们希望它能立即重启,java service wrapper可以为我们实现这一点。
        打开conf/wrapper.conf文件,对以下内容进行设置
        wrapper.filter.trigger.1001=Exception in thread "*" java.lang.OutOfMemoryError
        wrapper.filter.allow_wildcards.1001=TRUE
        wrapper.filter.action.1001=RESTART
        wrapper.filter.message.1001=The JVM has run out of memory.

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk