Método 1 - Integración usando WrapperSimpleApp (Linux / UNIX)

Descripción

El Método 1 hará uso de la clase helper WrapperSimpleApp para iniciar la aplicación. Esta es la forma más fácil de integrar su aplicación con el Wrapper, y se recomienda usar esta opción siempre que posible.

Sin embargo, hay algunas cosas que hay que tener en cuenta cuando se utiliza este método. Cuando el Wrapper apaga la máquina JVM, no hay ninguna notificación directa a su aplicación de que el apagado será limpio. En otras palabras, el Wrapper terminará la máquina JVM haciendo uso de System.exit() desde la máquina JVM. Si la aplicación ha registrado su propio Shutdown Hook, este se puede invocar, dando a la aplicación una oportunidad para apagarse limpiamente. Por otro lado, si ho se ha registrado un Shutdown Hook, la aplicación se cerrará repentinamente de la misma manera como cuando utiliza CTRL-C desde la consola (command window). En ambos casos, con o sin un Shutdown Hook, se generará el mismo comportamiento, es decir, como si la aplicación se ejecutara sin el Wrapper.

Cuando la integración se realiza con el método 1, la clase helper WrapperSimpleApp sustituye a la clase principal de la aplicación. Esto le da a la clase WrapperSimpleApp la oportunidad de inmediatamente iniciar el WrapperManager y registrar la JVM con el Wrapper. La clase WrapperSimpleApp entonces administra toda la interacción con el Wrapper, así como el ciclo de vida de una aplicación. Cuando el Wrapper envía un mensaje de inicio a la máquina JVM a través del WrapperManager, el método principal de la clase principal real de la aplicación es llamado.

Se le ordena a la clase helper WrapperSimpleApp cómo iniciar la aplicación al pasar el nombre de la clase principal de la aplicación seguido de parámetros adicionales al método principal de la clase WrapperSimpleApp.

Instrucciones Detalladas

Esta sección le guiará a través de una explicación detallada de cómo configurar una simple aplicación HelloWorld para funcionar con el Wrapper. La mayoría de las otras aplicaciones se pueden integrar siguiendo los mismos pasos.

Aplicación HelloWorld

Este tutorial iniciará una aplicación simple HelloWorld que solamente imprime "Hello world". La ruta para esta aplicación es /usr/lib/helloworld, que aquí será referenciada como {MYAPP_HOME}. Algunas otras carpetas (bin, lib, conf y logs) deben existir, en las cuales se copiarán los archivos del Wrapper.

Instalar Archivos del Wrapper

Hay cuatro directorios que se deben configurar para poder utilizar el Wrapper.

NOTA

Asegúrese de usar el Wrapper apropiado y los archivos libwrapper.so construidos para la plataforma usada. Parece obvio, pero la versión Linux del Wrapper no funcionará en Solaris, por ejemplo.

Directorio bin

El Wrapper tiene incluido un script de shell (sh) que se puede utilizar para iniciar y detener de forma fiable cualquier aplicación Java controlada por el Java Service Wrapper.

El primer paso es copiar los siguientes archivos en el directorio bin de HelloWorld (en versiones anteriores del Wrapper, este archivo se llamaba 'sh.script.in'):

{WRAPPER_HOME}/bin/wrapper
{WRAPPER_HOME}/src/bin/App.sh.in

Cambie el nombre del archivo de comandos para reflejar el nombre de la aplicación.

{MYAPP_HOME}/bin/helloworld

Ahora abra la secuencia de comandos en un editor. Necesitamos configurar los nombres largos y cortos para reflejar que la secuencia de comandos está siendo utilizado para iniciar HelloWorld. Verá dos grupos de variables inmediatamente después del encabezado de del script APP_NAME y APP_LONG_NAME. Algunos valores para estas variables que pueden usarse son presentados a continuación.

APP_NAME="helloworld"
APP_LONG_NAME="Hello World"

El script no requiere ninguna modificación adicional. Sin embargo, dicho script asumirá que el archivo wrapper.conf será localizado dentro del directorio conf (un nivel arriba, ../conf/wrapper.conf). Si desea colocar el archivo wrapper.conf en otro lugar, la variable WRAPPER_CONF requerirá una modificación apropiada.

NOTA

¡Importante! Antes de continuar, asegúrese de que todos los archivos que se han copiado en el directorio bin tienen sus bits ejecutables configurados.

Directorio lib

Copie la librería nativa en el directorio lib de HelloWorld:

{WRAPPER_HOME}/lib/libwrapper.so
{WRAPPER_HOME}/lib/wrapper.jar

El archivo libwrapper.so es un archivo de la librería nativa el cual es requerido por la porción del Wrapper que se ejecuta dentro de la máquina JVM. El archivo wrapper.jar contiene todas las clases del Wrapper.

NOTA

Note que la librería nativa sigue las convenciones de nombres ligeramente diferentes en algunas plataformas. Posibles nombres pueden incluir; libwrapper.a, libwrapper.sl, libwrapper.so, y libwrapper.jnilib. En cualquier caso, el archivo debe ser copidado sin cambiar la extensión.

Directorio conf

Todas las configuraciones del Wrapper deben hacerse en wrapper.conf. La ubicación estándar para este archivo está en el directorio conf que se encuentra en el directorio HOME de cada aplicación. Por favor copie la siguiente plantilla del archivo wrapper.conf.in en el directorio conf de HelloWorld.

{WRAPPER_HOME}/src/conf/wrapper.conf.in

Cambie el nombre del archivo como a continuación se muestra. Asegurese de remover la extensión .in para que el nombre del archivo sea wrapper.conf.

Usted debe tener ahora:

{MYAPP_HOME}/conf/wrapper.conf

Es posible cambiar la ubicación del archivo de configuración wrapper.conf si lo desea. Sin embargo, tendrá que modificar los scripts que previamente copió en el directorio bin para reflejar la nueva ubicación.

Directorio logs

El archivo de configuración por defecto wrapper.conf colocará un archivo wrapper.log en el directorio logs en el directorio HOME de la aplicación.

Asegúrese de haber creade el directorio:

{MYAPP_HOME}/logs

Si desea cambiar la ubicación del archivo wrapper.log, usted tendrá que editar el archivo wrapper.conf y modificar la propiedad wrapper.logfile para reflejar la nueva ubicación.

Directorio lang

A partir de la versión Wrapper 3.5.0, es posible localizar el Wrapper. Los archivos de recursos de idioma se pueden encontrar en el directorio lang. Si es necesario, cree un directorio lang en el directorio HOME de la aplicación y copie estos archivos a ese nuevo drectorio.

{MYAPP_HOME}/lang/wrapper_XX.mo
{MYAPP_HOME}/lang/wrapperjni_XX.mo

Si desea cambiar la ubicación de los archivos de recursos de idioma "*.mo", tendrá que editar el archivo wrapper.conf y modificar la propiedad wrapper.lang.folder para reflejar la nueva ubicación.

Localizar la Línea de Comandos de la Aplicación Java

Antes de que el Wrapper pueda ser configurado para lanzar una aplicación, usted tendrá que saber los comandos completos de Java que normalmente se utilizan.

La mayoría de las aplicaciones hacen uso de un script para construir la línea de comandos real. Estos scripts suelen ser muy difíciles de manejar, pero en realidad la capacidad ofrecida para no tener que trabajar con ellos es uno de los beneficios de usar el Wrapper.

La mayor parte del script tiene la tarea de recopilar información específica del sistema y almacenar esa información en las variables de entorno y luego ejecutar el comando Java.

Para configurar el Wrapper, lo único que realmente se necesita es la línea de comandos Java final.

En el caso de una aplicación simple HelloWorld, no se necesita un script. El comando para iniciar se ve como:

java com.tanukisoftware.HelloWorld

Un comando más complejo para iniciar una aplicación Java se vería así:

java -classpath "/usr/lib/helloworld/lib/myjar.jar" -Xms128M -Xmx512M com.tanukisoftware.HelloWorld arg1 arg2

Modificación del Archivo wrapper.conf

Para usar la línea de comandos Java anterior con el Wrapper, tenemos que dividir los componentes de la línea de comandos en un archivo de configuración. Abra el archivo wrapper.conf en un editor y hacer los cambios que se muestran a continuación.

NOTA

Donde se mencionan las propiedades, se proporcionan vínculos sobre sus descripciones. Por favor, tome un momento para revisar las descripciones de cualquier propiedad que se modifica. En muchos casos hay más detalles sobre su uso que a veces no son mencionados aquí.

Variable de Entorno:

Para facilitar la configuración, se recomienda guardar el directorio HOME de HelloWorld y Java en una variable de entorno en el archivo de configuraciones. Esto hará más fácil de leer el archivo conf y mantenerlo en caso de que la ruta de algún directorio cambie. Si se configura en el archivo de configuración, el Wrapper configurará las variables de entorno cada vez que inicie:

set.MYAPP_HOME=/usr/lib/helloworld
set.JAVA_HOME=/usr/lib/jvm/java-8-openjdk

Java Ejecutable

Primero es necesario extraer el Java ejecutable y asignar la ruta de ubicación a la propiedad wrapper.java.command:

wrapper.java.command=%JAVA_HOME%/bin/java

Argumentos Java

La mayoría de las aplicaciones proporcionan una serie de parámetros al Java ejecutable cuando es iniciado. El Wrapper ofrece propiedades especiales para configurar, como por ejemplo memoria, así como rutas de clases y librerías. Estas se explican a continuación. Sin embargo, cualquier otro ajuste es configurado usando la serie de propiedades wrapper.java.additional.<n>.

La aplicación HelloWorld cuenta con 2 argumentos adicionales Java.

wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M

La capacidad de memoria inicial y máxima de la JVM specificada por -Xms128M (inicial) y -Xmx512M (máxima) puede también definirse usando las propiedades wrapper.java.initmemory y wrapper.java.maxmemory.

# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128

# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512

Archivo jar del Wrapper

El Wrapper requiere que su propiedad wrapper.jar sea especificada:

wrapper.jarfile=%MYAPP_HOME%/lib/wrapper.jar

ADVERTENCIA

La propiedad wrapper.jarfile se introdució en la versión 3.5.55 del Wrapper. Si usa una versión más antigua del Wrapper, es necesario incluir wrapper.jar en la ruta de la clase (classpath):

wrapper.java.classpath.1=D:\apache-tomcat-9.0.0.M13\lib\wrapper.jar

Después, los índices de los siguientes elementos de classpath deben ajustarse para no repetir la propiedad wrapper.java.classpath.1.

Classpath

El siguiente paso es el classpath, que se configura usando las propiedades wrapper.java.classpath.<n>. El Wrapper requiere que el calsspath se divida en sus elementos individualmente.

wrapper.java.classpath.1=%MYAPP_HOME%/bin/myjar.jar

Clase Principal

Para establecer una comunicación entre HellowWorld y el Wrapper, es necesario usar la clase helper WrapperSimpleApp como la clase principal. La clase principal ejecutada por Java al iniciar se especifica usando la propiedad wrapper.java.mainclass. La clase principal de HelloWorld es entonces especificada como el primer parámetro de la aplicación (lea la sección siguiente).

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

Parámetros de la Aplicación

Los parámetros de las aplicaciones son establecidos usando las propiedades wrapper.app.parameter.<n>. Dichos parámetros aparecen en la línea de comandos Java luego después de la clase principal. Como se ha mencionado anteriormente, es necesario configurar el primer parámetro como la clase principal de HelloWorld. Todos los otros parámetros vienen después.

wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2

Ruta de la Librería

Se debe configurar una propiedad más para poder usar el Wrapper. El Wrapper hace uso de una librería nativa para controlar las interacciones con el sistema. Este archivo de librería libwrapper.so necesita ser especificado en la ruta de la librería que se envía a la JVM.

La ruta de la librería se especifica usando las propiedades wrapper.java.library.path.<n>.

wrapper.java.library.path.1=%MYAPP_HOME%/lib

Ponerlo en Práctica

Poniendo todo junto, obtenemos lo siguiente:

set.MYAPP_HOME=/usr/lib/helloworld
set.JAVA_HOME=/usr/lib/jvm/java-8-openjdk

wrapper.java.command=%JAVA_HOME%/bin/java

# Java Main class.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

# Wrapper Jar
wrapper.jarfile=%MYAPP_HOME%/lib/wrapper.jar

# Java Classpath
wrapper.java.classpath.1=%MYAPP_HOME%/bin/myjar.jar

# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=%MYAPP_HOME%/lib

# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE

# JVM settings
wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=128

# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=512

# Application parameters. Add parameters as needed starting from 1
wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2

Probarlo

HelloWorld se puede iniciar simplemente ejecutando el script bin/helloworld console. Debido a la manera en la que el Wrapper configura su directorio actual, no es necesario ejecutar este script desde el directorio bin.

Como verá si omite un comando, los scripts incluidos con el Wrapper son scripts Demonio bastante estandarizados. Dichos scripts aceptan los comandos console, start, stop, restart y dump. Los comandos start, stop, y restart son comúnes para casi todos los scripts Demonio, y son usados para controlar el Wrapper y su aplicación como un proceso Demonio. El comando status puede ser usado para determinar si el Wrapper está en ejecución. El comando console iniciará el Wrapper en el shell actual, haciendo posible que la aplicación sea eliminada usando CTRL-C. El comando final, dump, enviará una señal "kill -3" al Wrapper, causando que su JVM ejecute un vertedero de memoria completo.

Felicidades. Su aplicación debe estar ahora en marcha y funcionando.

Si experimenta algún problema, consulte la siguiente sección Solución de problemas para recibir ayuda y detectar el problema.

Nivel Avanzado

Preparando el Inicio

Por defecto, la clase WrapperSimpleApp espera 2 segundos para que el método principal de la aplicación se complete. Después de eso se asume que la aplicacion ha iniciado y envia un reporte al Wrapper. Esto se hace porque muchas aplicaciones se desarrollan con métodos principales que no regresan durante la vida de una aplicación. En estos casos, no hay una manera eficaz para que la clase WrapperSimpleApp informe cuando y/o si la aplicación a completado su inicio.

Sin embargo, si se sabe que el método principal de la aplicación retornará una vez que se inicia la aplicación, sería ideal que el Wrapper espere antes de continuar.

Propiedad de Sistema waitForStartMain:

Para los métodos principales que regresan de esta manera, la clase WrapperSimpleApp busca la propiedad de sistema org.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain. Si dicha propiedad esta habilitada como "TRUE", WrapperSimpleApp esperará indefinidamente a que el método principal se complete.

Ejemplo: (habilitar espera)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain=TRUE

Propiedad de Sistema maxStartMainWait:

Esperar indefinidamente es una buena opción si se sabe a ciencia cierta que el método principal volverá a su debido tiempo. Pero por otro lado, si se espera eternamente, el Wrapper no se dará por vencido en el proceso de inicio, no importa el tiempo que espere.

Por lo tanto, si hay alguna posibilidad de que este inicio pueda congelarse, entonces la propiedad de sistema org.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait se puede establecer con un tiempo máximo, como una mejor opción. Por ejemplo, para esperar hasta 5 minutos (300 segundos) para que el método principal complete su inicio, establezca la propiedad a 300 de la siguiente manera:

El valor por defecto es "2 segundos".

Ejemplo: (300 segundos)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=300

NOTA

Los principales métodos de muchas aplicaciones están diseñados para no volver. En estos casos, debe ser consistente con el tiempo de espera de inicio por defecto de 2 segundos para iniciar o especificar un tiempo de espera más largo, utilizando la propiedad maxStartMainWait property para simular la cantidad de tiempo que su aplicación necesita para iniciar.

ADVERTENCIA

Si se especifica "TRUE" en waitForStartMain para una aplicación cuyo método de inicio "start" nunca regresa, el Wrapper aparecerá al principio estar funcionando correctamente. Sin embargo, el Wrapper está realmente en un estado de espera eterno y nunca entrará en estado de ejecución donde pueda monitorear su aplicación.