Guía de migración
Para uso con la plataforma de aplicaciones empresariales JBoss 6 de Red Hat
Resumen
Capítulo 1. Introducción Copiar enlaceEnlace copiado en el portapapeles!
1.1. Plataforma de aplicaciones empresariales JBoss 6 de Red Hat Copiar enlaceEnlace copiado en el portapapeles!
1.2. Sobre la guía de migración Copiar enlaceEnlace copiado en el portapapeles!
Capítulo 2. Preparación para la migración Copiar enlaceEnlace copiado en el portapapeles!
2.1. Preparación para la migración Copiar enlaceEnlace copiado en el portapapeles!
Revisión de lo nuevo y diferente en JBoss EAP 6
En este lanzamiento se cambiaron un número de cosas que pueden tener impacto en la implementación de las aplicaciones de JBoss EAP 6. Dichos cambios incluyen cambios a la estructura del directorio de archivos, scripts, la configuración de implementación, la carga de clases y las búsquedas JNDI. Consulte Sección 2.2, “Revisión de lo nuevo y diferente en JBoss EAP 6” para ver mayores detalles.Revisión de la documentación de inicio rápido
Asegúrese de revisar el capítulo titulado Empiece a desarrollar aplicaciones en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. Contiene información importante sobre lo siguiente:- Java EE 6
- El nuevo sistema modular de carga de clases
- Cambios en la estructura de archivos
- Descarga e instalación de JBoss EAP 6
- Cómo descargar e instalar JBoss Developer Studio
- Cómo configurar Maven para su entorno de desarrollo
- Cómo descargar y ejecutar las aplicaciones de ejemplo de inicio rápido que se envían junto con el producto.
Aprenda a utilizar dependencias JBoss EAP 6 Dependencies en su proyecto Maven
Asegúrese de revisar el capítulo titulado Maven Guide in the Development Guide para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. La sección Manage Project Dependencies contiene información importante sobre cómo configurar su proyecto para utilizar arterfactos JBoss EAP Bill of Material (BOM).Análisis y comprensión de su aplicación
Cada aplicación es única y debe comprender de manera completa los componentes y arquitectura de la aplicación existente antes de intentar migrar.
Importante
2.2. Revisión de lo nuevo y diferente en JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
La siguiente es una lista de diferencias importantes en JBoss EAP 6 del lanzamiento anterior.
- Carga de clases con base en módulos
- En JBoss EAP 5, la arquitectura de carga de clases era jerárquica. En JBoss EAP 6, la carga de clases se basa en módulos JBoss. Esto ofrece un verdadero aislamiento de aplicaciones, esconde clases de implementación del servidor y sólo carga las clases que su aplicación necesita. La carga de clases es simultánea para un mejor rendimiento. Las aplicaciones escritas para JBoss EAP 5 se deben modificar para especificar las dependencias de módulos y en algunos casos, reempacar archivadores. Para mayor información, consulte la Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- Gestión de dominios
- En JBoss EAP 6, el servidor se puede ejecutar como un servidor autónomo en un dominio administrado. En un dominio administrado puede configurar grupos enteros de servidores a la vez, manteniendo las configuraciones sincronizadas a través de toda la red de servidores. Aunque esto no debe tener impacto en las aplicaciones construidas para lanzamientos anteriores, esto puede simplificar la administración de implementaciones en múltiples servidores. Para mayor información, consulte la sección sobre Dominios administrados en la Guía de administración y configuración para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- Configuración de implementación
- Servidores autónomos y dominios administrados
- JBoss EAP 5 utilizaba una configuración de implementación basada en perfiles. Estos perfiles se encontraban en el directorio
EAP_HOME/server/
. Con frecuencia las aplicaciones tenían múltiples archivos de configuración para seguridad, bases de datos, adaptadores de recursos y otras configuraciones. En JBoss EAP 6, la configuración de implementación se realiza utilizando un archivo. Este archivo se utiliza para configurar todos los servicios y subsistemas utilizados para la implementación. Un servidor autónomo se configura usando el archivoEAP_HOME/standalone/configuration/standalone.xml
. Para los servidores ejecutando en un dominio adminstrado, el servidor se configura usando el archivoEAP_HOME/domain/configuration/domain.xml
. La información que se encuentra en los múltiples archivos de configuración de JBoss EAP 5 se deben migrar al nuevo archivo único de configuración - Orden de implementaciones
- JBoss EAP 6 utiliza una inicialización rápida y simultánea para la implementación, lo cual mejora el rendimiento y la eficiencia. En la mayoría de los casos, el servidor de aplicaciones puede determinar automáticamente las dependencias por adelantado y seleccione la estrategia de implementación más eficiente. Sin embargo, las aplicaciones JBoss EAP 5 que consisten de múltiples módulos implementados como EARs y que utilizan las búsquedas JNDI en lugar de la inyección CDI o entradas de referencias de recursos pueden requerir cambios en la configuración.
- Estructura del directorio y scripts
- Como se mencionó anteriormente, JBoss EAP 6 ya no utiliza una configuración de implementación basada en perfiles así que no hay un directorio
EAP_HOME/server/
. Los archivos de configuración para servidores autónomos ahora se encuentran en el directorioEAP_HOME/standalone/configuration/
y las implementaciones se encuentran en el directorioEAP_HOME/standalone/deployments/
. Para los servidores ejecutando en un dominio administrado, los archivos de configuración se encuentran en el directorioEAP_HOME/domain/configuration/
.En JBoss EAP 5, el script LinuxEAP_HOME/bin/run.sh
o el script WindowsEAP_HOME/bin/run.bat
se utilizaba para iniciar el servidor. En JBoss EAP 6, el script de arranque del servidor depende de la manera en que ejecuta su servidor. El script LinuxEAP_HOME/bin/standalone.sh
o el script WindowsEAP_HOME/bin/standalone.bat
se utiliza para iniciar un servidor autónomo. El script LinuxEAP_HOME/bin/domain.sh
o el script WindowsEAP_HOME/bin/domain.bat
se utiliza para iniciar un dominio administrado. - Búsquedas JNDI
- JBoss EAP 6 ahora utiliza espacios de nombres JNDI portátiles estandarizados. Las aplicaciones escritas para JBoss EAP 5 que usan las búsquedas JNDI se deben cambiar para que sigan la nueva convención de espacios de nombres JNDI estándar. Para mayor información sobre la sintaxis de nombrado JNDI consulte Sección 3.1.8.2, “Nombres JNDI EJB portátiles”.
2.3. Revisión de la lista de funcionalidades no soportadas y ya no utilizadas Copiar enlaceEnlace copiado en el portapapeles!
Capítulo 3. Migre su aplicación Copiar enlaceEnlace copiado en el portapapeles!
3.1. Cambios requeridos por la mayoría de las aplicaciones Copiar enlaceEnlace copiado en el portapapeles!
3.1.1. Revisión de los cambios requeridos por la mayoría de las aplicaciones Copiar enlaceEnlace copiado en el portapapeles!
3.1.2. Cambios en la carga de clases Copiar enlaceEnlace copiado en el portapapeles!
3.1.2.1. Actualización de la aplicación debido a cambios en la carga de clases Copiar enlaceEnlace copiado en el portapapeles!
- Primero mire el empaque de su aplicación y sus dependencias. Para mayores detalles consulte: Sección 3.1.2.3, “Actualizar las dependencias de la aplicación debido a los cambios en la carga de clases”
- Si su aplicación realiza registros entonces necesita especificar las dependencias correctas de los módulos. Para obtener mayor información consulte: Sección 3.1.4.1, “Modificar las dependencias de registros”
- Debido a los cambios en la carga modular de clases es posible que tenga que cambiar la estructura de empaque de su EAR o WAR. Para obtener mayor información consulte: Sección 3.1.5.1, “Modificación del empaque de EARs y WARs”
3.1.2.2. Dependencias de módulos Copiar enlaceEnlace copiado en el portapapeles!
Un módulo solo puede acceder sus propias clases y las clases de cualquier módulo en el que tenga una dependencia explícita o implícita.
Procedimiento 3.1. Dependencias de módulos
Dependencias implícitas
Los implementadores dentro del servidor implícitamente agregan de manera automática algunas dependencias de módulos utilizadas comúnmente comojavax.api
ysun.jdk
. Esto hace que las clases sean visibles para la implementación en el tiempo de ejecución y libera al desarrollador de la tarea de agregar explícitamente las dependencias. Para obtener detalles sobre la manera en que estas dependencias implícitas se agregan, consulte Dependencias de módulos implícitos en el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.Dependencias explícitas
Para otras clases, los módulos se deben especificar explícitamente o de otra manera las dependencias que faltan generan errores en la implementación o en el tiempo de ejecución. Si una dependencia falta entonces verá rastros deClassNotFoundExceptions
oNoClassDefFoundErrors
en el registro del servidor. Si más de un módulo carga la misma JAR o un módulo carga una clase que extienda una clase cargada por un módulo diferente podrá ver los rastros deClassCastExceptions
en el registro del servidor. Para especificar dependencias de manera explícita, modifique elMANIFEST.MF
o cree un archivo descriptor de implementaciónjboss-deployment-structure.xml
específico para JBoss. Para mayor información sobre dependencias de módulos consulte la Sinopsis de carga de clases y módulos en el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
3.1.2.3. Actualizar las dependencias de la aplicación debido a los cambios en la carga de clases Copiar enlaceEnlace copiado en el portapapeles!
La carga de clases en JBoss EAP 6 es bastante diferente de las versiones anteriores de JBoss EAP. La carga de clases ahora se basa en el proyecto JBoss Modules. En lugar de un solo cargador de clases jerárquico que carga todas las JARs en una ruta de clases plana, cada biblioteca se convierte en un módulo que sólo enlaza con los módulos exactos de los que depende. Las implementaciones en JBoss EAP 6 también son módulos y no tienen acceso a las clases definidas en JARs en el servidor de aplicaciones a menos de que se defina una dependencia explícita en esas clases. Algunas dependencias de módulos definidas por el servidor de aplicaciones se configuran de manera automática. Por ejemplo, si está implementando una aplicación Java EE, se agrega una dependencia en la API Java EE a su módulo de manera automática o implícita. Para ver una lista completa de las dependencias que se agregan automáticamente por parte del servidor consulte la sección Implicit Module Dependencies en el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
Cuando migre su aplicación a JBoss EAP 6, es posible que necesite realizar una o más de las siguientes tareas debido a los cambios en la carga modular de clases:
3.1.3. Cambios del archivo de configuración Copiar enlaceEnlace copiado en el portapapeles!
3.1.3.1. Crear o modificar archivos que controlan la carga de clases en JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
Debido al cambio en JBoss EAP 6 para utilizar la carga de clases modular es posible que necesite crear o modificar uno o más archivos para agregar dependencias o para prevenir la carga de dependencias de manera automática. Para mayor información en la carga de clases y la precedencia de carga de clases consulte el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- jboss-web.xml
- Si definió un elemento
<class-loading>
en el archivojboss-web.xml
entonces tiene que borrarlo. El comportamiento que esto generaba en JBoss EAP 5 ahora es el comportamiento predeterminado de la carga de clases en JBoss EAP 6 así que ya no es necesario. Si no borra este elemento entonces verá un ParseError y una XMLStreamException en su registro del servidor.Esto es un ejemplo de un elemento<class-loading>
en el archivojboss-web.xml
que se ha comentado.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MANIFEST.MF
- Manualmente modificado
- Dependiendo de los componentes o módulos que su aplicación utilice es posible que necesite agregar una o más dependencias a este archivo. Las puede agregar como entradas
Dependencies
oClass-Path
.El siguiente es un ejemplo deMANIFEST.MF
modificado por un desarrollador:Manifest-Version: 1.0 Dependencies: org.jboss.logmanager Class-Path: OrderManagerEJB.jar
Manifest-Version: 1.0 Dependencies: org.jboss.logmanager Class-Path: OrderManagerEJB.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si modifica este archivo, asegúrese de incluir un caracter de nueva línea al final del archivo. - Generado usando Maven
- Si usa Maven necesita modificar su archivo
pom.xml
para generar las dependencias para el archivoMANIFEST.MF
. Si su aplicación usa EJB 3.0 es posible que tenga una sección en el archivopom.xml
que se vea así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si el código EJB 3.0 usaorg.apache.commons.log
necesita esa dependencia en el archivoMANIFEST.MF
. Para generar esa dependencia agregue el elemento<plugin>
al archivopom.xml
así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow En el ejemplo anterior el archivosrc/main/resources/META-INF/MANIFEST.MF
solo necesita contener la entrada de la dependencia:Dependencies: org.apache.commons.logging
Dependencies: org.apache.commons.logging
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Maven generará el archivoMANIFEST.MF
completo:Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- jboss-deployment-structure.xml
- Este archivo es un descriptor de implementación específico de JBoss que se puede utilizar para controlar la carga de clases de una manera detallada. Como el
MANIFEST.MF
, este archivo se puede utilizar para agregar dependencias. También puede prevenir el agregar dependencias automáticas, definir módulos adicionales, cambiar el comportamiento de cargas de clases aisladas de una implementación EAR y agregar raíces de recursos adicionales a un módulo.El siguiente es un ejemplo de un archivojboss-deployment-structure.xml
que agrega una dependencia para el módulo JSF 1.2 y previene la carga automática del módulo JSF 2.0.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para mayor información sobre este archivo consulte: Sección 3.1.3.2, “jboss-deployment-structure.xml”. - application.xml
- En versiones anteriores de JBoss EAP, usted controlaba el orden de las implementaciones dentro de un EAR usando el archivo
jboss-app.xml
. Esto ya no funciona así. La especificación Java EE6 proporciona el elemento<initialize-in-order>
en elapplication.xml
el cual permite controlar el orden en que los módulos Java EE se implementan dentro de un EAR.En la mayoría de los casos no necesita especificar el orden de la implementación. Si su aplicación usa inyecciones de dependencias y referencias de recursos para referirse a componentes en módulos externos, en la mayoría de los casos el elemento<initialize-in-order>
no se requiere ya que el servidor de aplicaciones puede determinar implícitamente la manera correcta y óptima de ordenar los componentes.Vamos a asumir que tiene una aplicación que contiene unmyBeans.jar
y unamyApp.war
empacados dentro de unmyApp.ear
. Un servlet en elmyApp.war
usa una anotación@EJB
para inyectar un bean desdemyBeans.jar
. En este caso, el servidor de aplicaciones tiene el conocimiento apropiado para asegurarse de que el componente EJB esté disponible antes de que se inicie el servlet y no tenga que utilizar el elemento<initialize-in-order>
.Sin embargo, si ese servlet usa referencias remotas del estilo de búsqueda JNDI de legado como las siguientes para acceder al bean es posible que necesite especificar el orden de los módulos.En este caso, el servidor no puede determinar que el componente EJB se encuentra en lainit() { Context ctx = new InitialContext(); ctx.lookup("TheBeanInMyBeansModule"); }
init() { Context ctx = new InitialContext(); ctx.lookup("TheBeanInMyBeansModule"); }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow myBeans.jar
y necesita reforzar que los componentes en lamyBeans.jar
sean inicializados antes que los componentes enmyApp.war
. Para lograr esto, configure el elemento<initialize-in-order>
comotrue
y especifique el orden de los módulosmyBeans.jar
ymyApp.war
en el archivoapplication.xml
.El siguientes es un ejemplo que usa el elemento<initialize-in-order>
para controlar el orden de la implementación. LamyBeans.jar
se implementa antes que el archivomyApp.war
.Copy to Clipboard Copied! Toggle word wrap Toggle overflow El esquema para el archivoapplication.xml
se puede encontrar en http://java.sun.com/xml/ns/javaee/application_6.xsd.Nota
Debe tener en cuenta que la configuración del elemento<initialize-in-order>
comotrue
demora la implementación. Es preferible definir dependencias apropiadas usando las inyecciones de dependencias o referencias de recursos ya que le da al contenedor mayor flexibilidad optimizando las implementaciones. - jboss-ejb3.xml
- El descriptor de implementación
jboss-ejb3.xml
reemplaza el descriptor de implementaciónjboss.xml
para sobreescribir y agregar a las funcionalidades proporcionadas por el descriptor de implementaciónejb-jar.xml
de la edición empresarial Java (EE). El nuevo archivo es incompatible conjboss.xml
y eljboss.xml
ahora se ignora en las implementaciones. - login-config.xml
- El archivo
login-config.xml
ya no se utiliza para la configuración de la seguridad. La seguridad ahora se configura en el elemento<security-domain>
en el archivo de configuración del servidor. Para un servidor autónomo, este es el archivostandalone/configuration/standalone.xml
. Si está ejecutando su servidor en un dominio administrado, este es el archivodomain/configuration/domain.xml
.
3.1.3.2. jboss-deployment-structure.xml Copiar enlaceEnlace copiado en el portapapeles!
jboss-deployment-structure.xml
es un nuevo descriptor de implementación opcional para JBoss EAP 6. Este descriptor de implementación proporciona control sobre la carga de clases en la implementación.
EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd
3.1.3.3. Empacar recursos para el nuevo sistema modular de carga de clases Copiar enlaceEnlace copiado en el portapapeles!
En versiones anteriores de JBoss EAP, todos los recursos dentro del directorio WEB-INF/
se agregaron a la ruta de clase WAR. En JBoss EAP 6, los artefactos de la aplicación web solo se cargan desde los directorios WEB-INF/classes
y WEB-INF/lib
. Si no se empacan los artefactos de la aplicación en los lugares especificados se pueden generar ClassNotFoundException
, NoClassDefError
u otros errores en tiempo de ejecución.
- Modificar el empaque de recursos
- Para hacer los recursos disponibles solo para la aplicación tiene que poner juntos los archivos de propiedades u otros artefactos con la WAR moviéndolos al directorio
WEB-INF/classes/
oWEB-INF/lib/
. Este enfoque se describe en más detalles aquí: Sección 3.1.3.4, “Cambiar la ubicación de las propiedades ResourceBundle” - Crear un módulo personalizado
- Si quiere hacer disponibles recursos personalizados para todas las aplicaciones ejecutando en el servidor de JBoss EAP 6 tiene que crear un módulo personalizado. Este enfoque se describe en más detalle aquí: Sección 3.1.3.5, “Crear un módulo personalizado”
3.1.3.4. Cambiar la ubicación de las propiedades ResourceBundle Copiar enlaceEnlace copiado en el portapapeles!
En versiones anteriores de JBoss EAP, el directorio EAP_HOME/server/SERVER_NAME/conf/
se encontraba en la ruta de clase y disponible para la aplicación. Para hacer las propiedades disponibles para la ruta de clase de la aplicación en JBoss EAP 6, debe empacarlas dentro de su aplicación.
Procedimiento 3.2. Cambiar la ubicación de las propiedades ResourceBundle
- Si está implementando un archivador WAR tiene que empacar esas propiedades en la carpeta
WEB-INF/classes/
del WAR. - Si quiere que esas propiedades sean accequibles para todos los componentes en un EAR entonces debe empacarlos en la raíz de una JAR y luego poner la JAR en la carpeta
lib/
del EAR.
3.1.3.5. Crear un módulo personalizado Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento 3.3. Crear un módulo personalizado
- Crear y poblar la estructura del directorio
module/
.- Crear una estructura de directorio bajo el directorio
EAP_HOME/module
para que contenga los archivos y JARs. Por ejemplo:cd EAP_HOME/modules/ mkdir -p myorg-conf/main/properties
$ cd EAP_HOME/modules/ $ cd EAP_HOME/modules/ $ cd EAP_HOME/modules/ $ mkdir -p myorg-conf/main/properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Mueva el archivo de propiedades al directorio
EAP_HOME/modules/myorg-conf/main/properties/
que creó en el paso anterior. - Cree un archivo
module.xml
en el directorioEAP_HOME/modules/myorg-conf/main/
conteniendo el siguiente XML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Modifique el subsistema
ee
en el archivo de configuración del servidor. Puede utilizar el CLI JBoss o puede modificar manualmente el archivo.- Siga estos pasos para modificar el archivo de configuración usando el CLI JBoss.
- Inicie el servidor y conéctese al CLI de administración.
- Para Linux, ingrese lo siguiente en la línea de comandos:
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Para Windows, ingrese lo siguiente en la línea de comandos:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
C:\>EAP_HOME\bin\jboss-cli.bat --connect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Debe ver la siguiente respuesta:Conectado a un controlador autónomo en localhost:9999
Conectado a un controlador autónomo en localhost:9999
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Para crear el elemento
myorg-conf
<global-modules> en el subsistemaee
escriba lo siguiente en la línea de comandos:/subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
/subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Debe ver el siguiente resultado:{"outcome" => "success"}
{"outcome" => "success"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Siga estos pasos si prefiere modificar manualmente el archivo de configuración del servidor.
- Detenga el servidor y abra el archivo de configuración del servidor en un editor de texto. Si está ejecutando un servidor autónomo este es el archivo
EAP_HOME/standalone/configuration/standalone.xml
o el archivoEAP_HOME/domain/configuration/domain.xml
si está ejecutando un dominio administrado. - Identifique el subsistema
ee
y agregue el módulo global paramyorg-conf
. El siguiente es un ejemplo del elemento subsistemaee
modificado para incluir el elementomyorg-conf
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Asumiendo que copió un archivo llamado
my.properties
en la ubicación correcta del módulo ahora puede cargar archivos de propiedades usando código similar al siguiente:Thread.currentThread().getContextClassLoader().getResource("my.properties");
Thread.currentThread().getContextClassLoader().getResource("my.properties");
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.4. Cambios de inicio de sesión Copiar enlaceEnlace copiado en el portapapeles!
3.1.4.1. Modificar las dependencias de registros Copiar enlaceEnlace copiado en el portapapeles!
JBoss LogManager soporta fachadas para todos los marcos de trabajo de registros de manera que pueda mantener su código actual de registro o mover a la nueva infraestructura de registro de JBoss. Independiente de su decision, debido a los cambios de carga de clases modulares probablemente necesita modificar su aplicación para agregar las dependencias requeridas.
Procedimiento 3.4. Actualización del código de registros de la aplicación
3.1.4.2. Actualización del código de aplicación para marcos de trabajo de registros de terceros Copiar enlaceEnlace copiado en el portapapeles!
En JBoss EAP 6, las dependencias de registros para marcos de trabajo de terceros como Apache Commons Logging, Apache log4j, SLF4J y Java Logging se agregan por defecto. En la mayoría de los casos es preferible utilizar el marco de trabajo de registro que el contenedor JBoss EAP proporciona. Sin embargo, si requiere funcionalidades especificas proporcionadas por un marco de trabajo de terceros, debe excluir el módulo JBoss EAP correspondiente de su implementación. Note que aunque su implementación utiliza el marco de trabajo de registro de terceros, los registros del servidor continúan utilizando la configuración del subsistema de registro de JBoss EAP.
org.apache.log4j
de su implementación. El primer procedimiento funciona en cualquier lanzamiento de JBoss EAP 6. El segundo procedimiento aplica solamente a JBoss EAP 6.3 o posteriores.
Procedimiento 3.5. Configuración de JBoss EAP 6 para utilizar un archivo log4j.properties o log4j.xml
Nota
- Cree un
jboss-deployment-structure.xml
con el siguiente contenido:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Ponga el archivo
jboss-deployment-structure.xml
en el directorioMETA-INF/
o en el directorioWEB-INF/
si está implementando un WAR o en el directorioMETA-INF/
si está implementando un EAR. Si su implementación incluye implementaciones dependientes hijas también debe excluir el módulo para cada subimplementación. - Incluya el archivo
log4j.properties
olog4j.xml
en el directoriolib/
de su EAR o el directorioWEB-INF/classes/
de su implementación WAR. Si prefiere poner el archivo en el directoriolib/
de su WAR, debe especificar la ruta<resource-root>
en el archivojboss-deployment-structure.xml
.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Inicie el servidor JBoss EAP 6 con el siguiente argumento de tiempo de ejecución para prevenir que se presente una
ClassCastException
en la consola cuando implementa la aplicación:-Dorg.jboss.as.logging.per-deployment=false
-Dorg.jboss.as.logging.per-deployment=false
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Implemente su aplicación.
Procedimiento 3.6. Configuración de las dependencias de registro para JBoss EAP 6.3 o posteriores
add-logging-api-dependencies
para excluir dependencias del marco de trabajo de registro de terceros. Los siguientes pasos demuestran cómo modificar este atributo de registro en un servidor autónomo JBoss EAP.
- Inicie el servidor JBoss EAP 6 con el siguiente argumento de tiempo de ejecución para prevenir que se presente una
ClassCastException
en la consola cuando implementa la aplicación:-Dorg.jboss.as.logging.per-deployment=false
-Dorg.jboss.as.logging.per-deployment=false
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Abra una terminal y conéctese al CLI de administración.
- Para Linux, ingrese lo siguiente en la línea de comandos:
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Para Windows, ingrese lo siguiente en la línea de comandos:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
C:\>EAP_HOME\bin\jboss-cli.bat --connect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Modifique el atributo
add-logging-api-dependencies
en el subsistema de registro.Este atributo controla si el contenedor debe agregar dependencias implícitas API de registro a sus implementaciones.- Si se configura como
true
, el cual es el valor predeterminado entonces se agregan todas las dependencias API de registro implícitas. - Si se configura como
false
entonces las dependencias no se agregan a sus implementaciones.
Para excluir las dependencias del marco de trabajo de registro de terceros debe establecer este atributo comofalse
utilizando el siguiente comando:/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Este comando agrega el elemento<add-logging-api-dependencies>
al subsistemalogging
del archivo de configuraciónstandalone.xml
.<subsystem xmlns="urn:jboss:domain:logging:1.4"> <add-logging-api-dependencies value="false"/> .... </subsystem>
<subsystem xmlns="urn:jboss:domain:logging:1.4"> <add-logging-api-dependencies value="false"/> .... </subsystem>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Implemente su aplicación.
3.1.4.3. Modificar el código para utilizar el nuevo marco de trabajo de inicio de sesión JBoss Copiar enlaceEnlace copiado en el portapapeles!
Para utilizar el nuevo marco de trabajo, cambie sus importaciones y su código así:
Procedimiento 3.7. Modificar el código y las dependencias para utilizar el marco de trabajo de inicio de sesión JBoss
Cambie sus importaciones y su código de inicio de sesión
El siguiente es un ejemplo del código que utiliza el nuevo marco de trabajo de inicio de sesión JBoss:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Agregue la dependencia de inicio de sesión
La JAR que contiene las clases de inicio de sesión de JBoss se encuentra en el módulo llamadoorg.jboss.logging
. Su archivoMANIFEST-MF
se debe ver así:Manifest-Version: 1.0 Dependencies: org.jboss.logging
Manifest-Version: 1.0 Dependencies: org.jboss.logging
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para mayor información sobre cómo encontrar la dependencia del módulo consulte Sección 3.1.2.3, “Actualizar las dependencias de la aplicación debido a los cambios en la carga de clases” and Sección 4.2.1, “Depurar y resolver problemas de migración”.
3.1.5. Cambios en el empaque de aplicaciones Copiar enlaceEnlace copiado en el portapapeles!
3.1.5.1. Modificación del empaque de EARs y WARs Copiar enlaceEnlace copiado en el portapapeles!
Cuando migra su aplicación puede que tenga que cambiar la estructura del empaque de su EAR o WAR debido al cambio en la carga modular de clases. Las dependencias de módulos se cargan en este orden específico:
- Dependencias del sistema
- Dependencias del usuario
- Recursos locales
- Dependencias de inter-implementación
Procedimiento 3.8. Modificación del empaque de archivadores
Empaque de un WAR
Un WAR es un solo módulo y todas las clases en el WAR se cargan con el mismo cargador de clases. Esto significa que las clases empacadas en el directorioWEB-INF/lib/
se tratan de igual manera que las clases en el directorioWEB-INF/classes
.Empaque de un EAR
Un EAR consiste de múltiples módulos. El directorioEAR/lib/
es un solo módulo y toda subimplementación EJB jar o WAR dentro del EAR es un módulo separado. Las clases no tienen acceso a las clases en otros módulos dentro del EAR a menos de que se hayan definido dependencias explícitas. Las subimplementaciones siempre tienen una dependencia automática en el módulo padre el cual les proporciona acceso a las clases en el directorioEAR/lib/
. Sin embargo, las subimplementaciones no siempre tienen una dependencia automática para permitirles el acceso entre ellas. Este comportamiento se controla configurando el elemento<ear-subdeployments-isolated>
en la configuración del subsistemaee
así:<subsystem xmlns="urn:jboss:domain:ee:1.0" > <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </subsystem>
<subsystem xmlns="urn:jboss:domain:ee:1.0" > <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </subsystem>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Por defecto esto se configura como falso, lo cual permite que las subimplementaciones vean las clases que pertenecen a otras subimplementaciones dentro del EAR.Para mayor información sobre la carga de clases consulte el capítulo titulado Módulos y carga de clases en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
3.1.6. Cambios de configuración del adaptador de recursos y fuentes de datos Copiar enlaceEnlace copiado en el portapapeles!
3.1.6.1. Actualización de la aplicación debido a cambios en la configuración Copiar enlaceEnlace copiado en el portapapeles!
- Si su aplicación usa una fuente de datos consulte: Sección 3.1.6.2, “Actualización de la configuración de la fuente de datos”.
- Si su aplicación usa JPA y actualmente une las JARs Hibernate consulte lo siguiente para ver sus opciones de migración: Sección 3.1.6.4, “Configuración de la fuente de datos para Hibernate o JPA”.
- Si su aplicación usa un adaptador de recursos consulte: Sección 3.1.6.5, “Actualización de la configuración del adaptador de recursos”.
- Revise lo siguiente para obtener mayor información sobre cómo configurar los cambios para la seguridad básica: Sección 3.1.7.1, “Configuración de los cambios de seguridad de la aplicación”.
3.1.6.2. Actualización de la configuración de la fuente de datos Copiar enlaceEnlace copiado en el portapapeles!
En versiones anteriores de JBoss EAP, la configuración de la fuente de datos JCA se definía en un archivo con el sufijo *-ds.xml
. Luego este archivo se implementaba en el directorio deploy/
del servidor o se empacaba con la aplicación. El controlador JDBC se copiaba al directorio server/lib/
o se empacaba en el directorio WEB-INF/lib/
de la aplicación. Mientras que este método de configuración de una fuente de datos todavía se soporta para el desarrollo, no se recomienda para producción ya que no se soporta por las herramientas de administrativas y de gestión de JBoss.
domain/configuration/domain.xml
. Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo, la fuente de datos está configurada en el standalone/configuration/standalone.xml file
. Las fuentes de datos configuradas de esta manera se pueden administrar y controlar usando las interfaces de administración JBoss, incluyendo la consola de administración web y la interfaz de la línea de comandos (CLI). Estas herramientas facilitan el administrar las implementaciones y configurar múltiples servidores ejecutando en un dominio administrado.
Un controlador que cumple con los requerimientos de JDBC 4.0 se puede instalar como una implementación o como un módulo núcleo. Un controlador que cumple con los requerimientos de JDBC 4.0 contiene un archivo META-INF/services/java.sql.Driver
que especifica el nombre de la clase del controlador. Un controlador que no cumpla con los requerimientos de JDBC 4.0 requiere pasos adicionales. Para mayores detalles sobre cómo hacer que un controlador cumpla con los requerimientos de JDBC 4.0 y cómo actualizar su configuración actual de la fuente de datos con una que sea administrada por la consola de administración web y CLI, consulte Sección 3.1.6.3, “Instalación y configuración del controlador JDBC”.
Puede utilizar la herramienta IronJacamar para migrar las configuraciones del adaptador de recursos y la fuente de datos. Esta herramienta convierte los archivos de configuración de estilo *-ds.xml
al formato esperado por JBoss EAP 6. Para mayor información, consulte: Sección 4.1.6, “Uso de la herramienta IronJacamar para migrar configuraciones del adapatador de recursos y la fuente de datos”.
3.1.6.3. Instalación y configuración del controlador JDBC Copiar enlaceEnlace copiado en el portapapeles!
El controlador JDBC se puede instalar en el contenedor en una de las siguientes dos maneras:
- Como una implementación
- Como un módulo núcleo
domain/configuration/domain.xml
. Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo entonces la fuente de datos se configura en el archivo standalone/configuration/standalone.xml
. Puede encontrar información de referencia del esquema, el cual es el mismo para ambos modos, en el directorio doc/
de la instalación de JBoss EAP 6. Para esta explicación vamos a asumir que el servidor está ejecutando como un servidor autónomo y la fuente de datos se configura en el archivo standalone.xml
.
Procedimiento 3.9. Instalación y configuración del controlador JDBC
Instale el controlador JDBC.
Instale el controlador JDBC como implementación.
Esta es la manera recomendada de instalar el controlador. Cuando el controlador JDBC se instala como una implementación, se implementa como una JAR normal. Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo, copie la JAR que cumple con los requerimientos de JDBC 4.0 en el directorioEAP_HOME/standalone/deployments/
. Para un dominio administrado tiene que utilizar la consola de administración o el CLI de administración para implementar la JAR en los grupos de servidores.El siguiente es un ejemplo de un controlador MySQL JDBC instalado como una implementación en un servidor autónomo:$cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/
$cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/EAP_HOME/standalone/deployments/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cualquier controlador que cumple con los requerimientos de JDBC 4.0 es reconocido automáticamente y se instala en el sistema por nombre y versión. Una JAR que cumple con los requerimientos de JDBC 4.0 contiene un archivo de texto llamadoMETA-INF/services/java.sql.Driver
, el cual especifica los nombres de las clases controladoras. Si el controlador no cumple con los requerimientos de JDBC 4.0 entonces se puede hacer que se implemente de una de las siguientes maneras:- Cree y agregue un archivo
java.sql.Driver
a la JAR bajo la rutaMETA-INF/services/
. Este archivo debe contener el nombre de la clase del controlador, por ejemplo:com.mysql.jdbc.Driver
com.mysql.jdbc.Driver
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Cree un archivo
java.sql.Driver
en el directorio de implementaciones. Para una instancia de JBoss EAP 6 ejecutando como un servidor autónomo, el archivo se debe poner aquí:EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver
. Si el servidor está en un dominio administrado entonces debe utilizar la consola de administración o el CLI de administración para implementar el archivo.
Las ventajas de este enfoque son:Las desventajas de este enfoque son:- Este es el método más fácil ya que no hay necesidad de definir un módulo.
- Cuando el servidor está ejecutando en un dominio administrado, las implementaciones que usan este enfoque se propagan de manera automática en todos los servidores en el dominio. Esto significa que el administrador no necesita distribuir el controlador JAR manualmente.
- Si el controlador JDBC consiste de mas de una JAR, por ejemplo el controlador JAR más una licencia JAR dependiente o una JAR de localización, no puede instalar el controlador como una implementación. Tiene que instalar el controlador JDBC como un módulo núcleo.
- Si el controlador no cumple con los requerimientos de JDBC 4.0 entonces se debe crear un archivo que contenga los nombres de las clases controladoras y tiene que ser importado en la JAR o superpuesto en el directorio
deployments/
.
Instalación del controlador JDBC como módulo central .
Para instalar un controlador JDBC como un módulo núcleo, tiene que crear una estructura de ruta de archivos bajo el directorioEAP_HOME/modules/
. Esta estructura contiene la JAR del controlador JDBC, las JARS de localización o las licencias adicionales del vendedor y un archivomodule.xml
para definir el módulo.Instale el controlador MySQL JDBC como módulo núcleo
- Cree la estructura del directorio
EAP_HOME/modules/com/mysql/main/
- En el subdirectorio
main/
, cree un archivomodule.xml
que contenga la siguiente definición de módulo para el controlador MySQL JDBC:Copy to Clipboard Copied! Toggle word wrap Toggle overflow El nombre del módulo, "com.mysql", coincide con la estructura del directorio para este módulo. El elemento<dependencies>
se usa para especificar las dependencias de este módulo en otros módulos. En este caso, tal como los es con todas las fuentes de datos JDBC, depende de las APIs JDBC Java que se definen en otro módulo llamadojavax.api
. Ese módulo se encuentra bajo el directoriomodules/system/layers/base/javax/api/main/
.Nota
Asegúrese de NO tener un espacio al principio del archivomodule.xml
de otra manera obtendrá un error "New missing/unsatisfied dependencies" para este controlador. - Copie la JAR del controlador MySQL JDBC en el directorio
EAP_HOME/modules/com/mysql/main/
:cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/
$ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/EAP_HOME/modules/com/mysql/main/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Instalación del controlador IBM DB2 JDBC y la JAR licencia como un módulo núcleo.
Este ejemplo se proporciona sólo para demostrar la manera de implementar controladores que requieren JARs además de la JAR del controlador JDBC.- Cree la estructura del directorio
EAP_HOME/modules/com/ibm/db2/main/
. - En el subdirectorio
main/
, cree un archivomodule.xml
que contenga la siguiente definición de módulo para el controlador IBM DB2 JDBC y licencia:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
Asegúrese de NO tener un espacio al principio del archivomodule.xml
de otra manera obtendrá un error "New missing/unsatisfied dependencies" para este controlador. - Copie el controlador JDBC y la JAR de lincencia en el directorio
EAP_HOME/modules/com/ibm/db2/main/
.cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/
$ cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/EAP_HOME/modules/com/ibm/db2/main/ $ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/EAP_HOME/modules/com/ibm/db2/main/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Las ventajas de este enfoque son:Las desventajas de este enfoque son:- Este es el único enfoque que funciona cuando el controlador JDBC consiste de más de una JAR.
- Con este enfoque, los controladores que no cumplen con los requerimientos de JDBC 4.0 se pueden instalar sin modificar la JAR del controlador o creando una superposición de archivos.
- Es más dificil configurar un módulo.
- El módulo se debe copiar manualmente en todos los servidores ejecutando en un dominio administrado.
Configure la fuente de datos.
Agregue el controlador de la base de datos.
Agregar el elemento<driver>
al elemento<drivers>
del mismo archivo. Nuevamente esto contiene alguna de la misma información de la fuente de datos que se definió previamente en el archivo*-ds.xml
.Primero determine si la JAR controladora cumple con los requerimientos de JDBC 4.0. Una JAR que cumple con los requerimientos de JDBC 4.0 contiene un archivoMETA-INF/services/java.sql.Driver
que especifica el nombre de la clase controladora. El servidor usa este archivo para encontrar el nombre de las clases controladoras en la JAR. Un controlador que cumpla con los requerimientos de JDBC 4.0 no requiere un elemento<driver-class>
ya que ya se especifica en la JAR. Este es un ejemplo del elemento controlador para un controlador MySQL que cumple con los requerimientos de JDBC 4.0:Un controlador que no cumple con los requerimientos de JDBC 4.0 requiere un atributo<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <driver-class>
para identificar la clase del controlador ya que no hay un archivoMETA-INF/services/java.sql.Driver
que especifique el nombre de la clase controladora. Este es un ejemplo del elemento controlador para el controlador que no cumpla con los requerimientos de JDBC 4.0:<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"> <driver-class>com.mysql.jdbc.Driver</driver-class></driver>
<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"> <driver-class>com.mysql.jdbc.Driver</driver-class></driver>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Creación de la fuente de datos.
Cree un elemento<datasource>
en la sección<datasources>
del archivostandalone.xml
. Este archivo contiene mucha de las misma información de la fuente de datos que se definió anteriormente en el archivo*-ds.xml
.Importante
Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.El siguiente es un ejemplo de un elemento de la fuente de datos MySQL en el archivostandalone.xml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Actualización de las referencias JNDI en el código de la aplicación.
Debe reemplazar los nombres de las búsquedas JNDI que estén desactualizados en el código fuente de la aplicación para utilizar los nuevos nombres de la fuente de datos estándar JNDI que haya definido. Para obtener mayor información, consulte: Sección 3.1.8.4, “Modifique la aplicación a seguir las nuevas reglas de los espacios de nombre JNDI”.También debe reemplazar cualquier anotación@Resource
existente que acceda la fuente de datos para utilizar el nuevo nombre JNDI. Por ejemplo:@Resource(name = "java:/YourDatasourceName").
@Resource(name = "java:/YourDatasourceName").
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.6.4. Configuración de la fuente de datos para Hibernate o JPA Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento 3.10. Borre el paquete Hibernate
- Borre las JARs Hibernate de sus carpetas de la biblioteca de su aplicación.
- Borre o comente el elemento
<hibernate.transaction.manager_lookup_class>
en su archivopersistence.xml
ya que este elemento no se necesita.
3.1.6.5. Actualización de la configuración del adaptador de recursos Copiar enlaceEnlace copiado en el portapapeles!
En versiones anteriores del servidor de aplicaciones, la configuración del adaptador de recursos se definía en un archivo con el sufijo *-ds.xml
. En JBoss EAP 6 se configura un adaptador de recursos en el archivo de configuración del servidor. Si está ejecutando en un dominio administrado, el archivo de configuración es el archivo EAP_HOME/domain/configuration/domain.xml
. Si está ejecutando como un servidor autónomo configure el adaptador de recursos en el archivo EAP_HOME/standalone/configuration/standalone.xml
. Puede encontrar información de referencia sobre el esquema, el cual es el mismo para ambos modos en: Schemas en el sitio web de IronJacamar aquí: http://www.ironjacamar.org/documentation.html.
Importante
La información del descriptor del adaptador de recursos se define bajo el siguiente elemento del subsistema en el archivo de configuración del servidor:
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
*-ds.xml
.
3.1.7. Cambios de seguridad Copiar enlaceEnlace copiado en el portapapeles!
3.1.7.1. Configuración de los cambios de seguridad de la aplicación Copiar enlaceEnlace copiado en el portapapeles!
En las versiones anteriores de JBoss EAP, los archivos de propiedades que se encuentran en el directorio EAP_HOME/server/SERVER_NAME/conf/
estaban en la ruta de clase y UsersRolesLoginModule
los podía encontrar fácilmente. En JBoss EAP 6, la estructura del directorio ha cambiado. Los archivos de propiedades deben estar empacados dentro de la aplicación para que estén disponibles en la ruta de clases.
Importante
security-domains
a los archivos de configuración del servidor standalone/configuration/standalone.xml
o domain/configuration/domain.xml
:
${jboss.server.config.dir}
se refiere al directorio EAP_HOME/standalone/configuration/
. Si la instancia está ejecutando en un dominio administrado, ${jboss.server.config.dir}
se refiere al directorio EAP_HOME/domain/configuration/
.
En JBoss EAP 6, los dominios de seguridad ya no usan el prefijo java:/jaas/
en sus nombres.
- Para las aplicaciones web, tiene que borrar este prefijo de las configuraciones del dominio de seguridad en el
jboss-web.xml
. - Para las aplicaciones empresariales tiene que borrar este prefijo de las configuraciones del dominio de seguridad en el archivo
jboss-ejb3.xml
. Este archivo ha reemplazado eljboss.xml
en JBoss EAP 6.
3.1.7.2. Actualización de aplicaciones que usan PicketLink STS y Web Services Copiar enlaceEnlace copiado en el portapapeles!
Si su aplicación JBoss EAP 6.1 usa PicketLink STS y Web services entonces es posible que tenga que realizar cambios cuando migre a JBoss EAP 6.2 o posteriores. Un arreglo aplicado a JBoss EAP para abordar CVE-2013-2133 refuerza los chequeos de autorización por parte del contenedor antes de ejecutar cualquier controlador JAXWS adjunto a los puntos finales WS basados en EJB3. Por lo tanto, algunas de las funcionalidades de PicketLink STS se pueden ver afectadas ya que el PicketLink SAML2Handler
establece un principal de seguridad para utilizarlo más adelante en el proceso. Es posible que encuentre una NullPointerException
en el registro del servidor ya que el principal es NULL
cuando el HandlerAuthInterceptor
accede al SAML2Handler
. Tiene que desactivar este chequeo de seguridad para solucionar este problema.
Procedimiento 3.11. Desactivación de chequeos adicionales de autorización
- Puede desactivar los chequeos adicionales de autorización y seguir utilizando las implementaciones PicketLink existentes utilizando uno de los siguientes métodos.
Configuración de una propiedad a nivel del sistema
Puede desactivar chequeos adicionales de autorización a nivel del servidor configurando el valor de la propiedad del sistemaorg.jboss.ws.cxf.disableHandlerAuthChecks
comotrue
. Este método afecta cualquier implementación realizada en el servidor de aplicaciones.Para obtener mayor información sobre cómo configurar una propiedad del sistema consulte la sección titulada Configuración de propiedades del sistema utilizando el CLI de administración en la Guía de configuración y administración para JBoss EAP.Creación de una propiedad en el archivo descriptor de servicios web de la implementación
Puede desactivar chequeos adicionales de autorización a nivel de la implementación configurando el valor de la propiedadorg.jboss.ws.cxf.disableHandlerAuthChecks
comotrue
en el archivojboss-webservices.xml
. Este método tiene impacto solo en la implementación especifica.- Cree un archivo
jboss-webservices.xml
en el directorioMETA-INF/
de la implementación en la que quiere desactivar los chequeos adicionales de autorización. - Agregue el siguiente contenido:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Nota
org.jboss.ws.cxf.disableHandlerAuthChecks
hace el sistema vulnerable a CVE-2013-2133. Si la aplicación espera que se apliquen restricciones de seguridad declaradas en métodos EJB y no las aplica de manera independiente al controlador JAX-WS entonces la propiedad no se debe habilitar. La propiedad solo se debe utilizar para propósitos de compatibilidad retroactiva cuando se necesita evitar que dañe la aplicación.
3.1.8. Cambios de JNDI Copiar enlaceEnlace copiado en el portapapeles!
3.1.8.1. Actualización de los nombres de espacios de nombres JNDI de la aplicación Copiar enlaceEnlace copiado en el portapapeles!
EJB 3.1 introdujo un espacio de nombre JNDI global estandarizado y una serie de espacios de nombres relacionados que mapean a los variados ámbitos de una aplicación Java EE. Los nombres EJB portátiles solo se enlazan a tres de ellos: java:global
, java:module
y java:app
. Las aplicaciones con EJBs que usan JNDI se deben cambiar para que sigan la nueva convención de espacios de nombre JNDI estándarizada.
Procedimiento 3.12. Modificar búsquedas JNDI
- Mayor información sobre Sección 3.1.8.2, “Nombres JNDI EJB portátiles”
Aqui puede encontrar ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6: Sección 3.1.8.5, “Ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6”
3.1.8.2. Nombres JNDI EJB portátiles Copiar enlaceEnlace copiado en el portapapeles!
La especificación Java EE 6 define cuatro espacios de nombres lógicos, cada uno con su propio ámbito, pero los nombres EJB portátiles solo se enlazan a tres de ellos. La siguiente tabla detalla cuándo y cómo utilizar cada espacio de nombre.
Espacio de nombre JNDI | Descripción |
---|---|
java:global |
Los nombres en este espacio de nombres son compartidos por todas las aplicaciones implementadas en una instancia del servidor de aplicaciones. Use los nombres en este espacio de nombres para encontrar archivadores externos EJBs implementados en el mismo servidor.
El siguiente es un ejemplo de un espacio de nombre java:global:
java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction
|
java:module |
Los nombres en este espacio de nombre son compartidos por todos los componentes en un módulo, por ejemplo, todos los beans empresariales en un solo módulo EJB o todos los componentes en un módulo web.
El siguiente es un ejemplo de un espacio de nombres java:module:
java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking
|
java:app |
Los nombres en este espacio de nombres son compartidos por todos los componentes en todos los módulos en una sola aplicación. Por ejemplo,un archivo jar EJB y una WAR en el mismo archivo EAR tendrían acceso a los recursos en el espacio de nombres java:app.
El siguiente es un ejemplo de un espacio de nombres java:app:
java:app/jboss-seam-booking-jar/HotelBookingAction
|
3.1.8.3. Revisión de las reglas del espacio de nombres de JNDI Copiar enlaceEnlace copiado en el portapapeles!
JBoss EAP 6 ha mejorado en los nombres de espacio de nombres JNDI no solo para brindar reglas predecibles y consistentes para todo nombre enlazado en el servidor de aplicaciones sino también para prevenir futuros problemas de compatibilidad. Esto significa que es posible que encuentre problemas con los espacios de nombre actuales en su aplicación si no siguen las nuevas reglas.
- Nombres relativos no calificados como
DefaultDS
ojdbc/DefaultDS
deben ser calificados relativos ajava:comp/env
,java:module/env
ojava:jboss/env
, dependiendo del contexto. - Nombres no calificados
absolute
como/jdbc/DefaultDS
deben ser calificados con relación a un nombrejava:jboss/root
. - Nombres calificados
absolute
comojava:/jdbc/DefaultDS
se deben calificar de la misma manera que los nombresabsolute
no calificados anteriores. - El espacio de nombres especial
java:jboss
se comparte a través de toda la instancia del servidor AS. - Cualquier nombre
relative
con un prefijojava:
debe estar en uno de los cinco espacios de nombre:comp
,module
,app
,global
o eljboss
propietario. Cualquier nombre que inicie porjava:xxx
en donde xxx no coincida con ninguno de los cinco anteriores generaría un error de nombre inválido.
3.1.8.4. Modifique la aplicación a seguir las nuevas reglas de los espacios de nombre JNDI Copiar enlaceEnlace copiado en el portapapeles!
- Este es un ejemplo de una búsqueda JNDI en JBoss EAP 5.1. Este código usualmente se encuentra en un método de inicialización.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note que el nombre de búsqueda esOrderManagerApp/ProductManagerBean/local
. - El siguiente es un ejemplo de la manera en que la misma búsqueda se codificaría en JBoss EAP 6 usando la inyección de dependencias.
@EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager") private ProductManager productManager;
@EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager") private ProductManager productManager;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Los valores de la búsqueda ahora se definen como variables de miembros y usan el nuevo espacio de nombre JNDI portátiljava:app
java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager
. - Si prefiere no utilizar la inyección de dependencias entonces puede continuar creando el nuevo InitialContext como se mostró anteriormente y modificar la búsqueda para utilizar el nuevo espacio de nombre JNDI.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.8.5. Ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
Espacios de nombres en JBoss EAP 5.x | Espacios de nombres en JBoss EAP 6 | Comentarios adicionales |
---|---|---|
OrderManagerApp/ProductManagerBean/local | java:module/ProductManagerBean!services.ejb.ProductManager | Enlace estándar Java EE 6. Con el ámbito del módulo actual y solamente accesible dentro del mismo módulo. |
OrderManagerApp/ProductManagerBean/local | java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | Enlace estándar Java EE 6. Con el ámbito de la aplicación actual y solamente accesible dentro de la misma aplicación. |
OrderManagerApp/ProductManagerBean/local | java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | Enlace estándar Java EE 6. Con el ámbito del servidor de aplicaciones y accesible globalmente. |
java:comp/UserTransaction | java:comp/UserTransaction | El espacio de nombres tiene como ámbito el componente actual. No es accesible para hilos que no sean Java EE 6, por ejemplo, hilos creados directamente por su aplicación. |
java:comp/UserTransaction | java:jboss/UserTransaction | Globalmente accesible. Úselo si java:comp/UserTransaction no está disponible |
java:/TransactionManager | java:jboss/TransactionManager | |
java:/TransactionSynchronizationRegistry | java:jboss/TransactionSynchronizationRegistry |
3.2. Cambios dependientes de la arquitectura de su aplicación y componentes Copiar enlaceEnlace copiado en el portapapeles!
3.2.1. Revisión de los cambios dependiendo de la arquitectura y componentes de su aplicación Copiar enlaceEnlace copiado en el portapapeles!
- Hibernate y JPA
- Si su aplicación usa Hibernate o JPA es posible que su aplicación necesite algunas modificaciones. Para mayor información consulte: Sección 3.2.2.1, “Actualizar aplicaciones que utilizan Hibernate y/o JPA”.
- REST
- Si su aplicación usa JAX-RS, debe estar conciente de que JBoss EAP 6 configura automáticamente RESTEasy así que ya no necesita configurarla usted mismo. Para mayor información consulte: Sección 3.2.5.1, “Configure los cambios de JAX-RS y RESTEasy”
- LDAP
- El dominio de seguridad LDAP está configurado de manera diferente en JBoss EAP 6. Si su aplicación usa LDAP consulte el siguiente tema para obtener mayor información: Sección 3.2.6.1, “Configuración de los cambios del dominio de seguridad LDAP”.
- Mensajería
- JBoss Messaging ya no se incluye en JBoss EAP 6. Si su aplicación usa JBoss Messaging como proveedor de mensajería entonces necesita reemplazar el código de JBoss Messaging con el de HornetQ. El siguiente tema describe lo que necesita hacer: Sección 3.2.7.4, “Migre su aplicación para usar HornetQ como proveedor JMS”.
- Uso de clústers
- La manera de habilitar el uso de clústers cambió en JBoss EAP 6. Para ver más detalles, consulte: Sección 3.2.8.1, “Realizar cambios a su aplicación para uso de clústers”.
- Implementación de estilo de servicios
- Aunque JBoss EAP 6 ya no usa descriptores de estilo de servicios, el contenedor soporta estas implementaciones de estilo de servicios sin cambios en donde sea posible. Para mayor información sobre la implementación, consulte: Sección 3.2.9.1, “Actualización de aplicaciones que utilizan las implementaciones de estilo del servicio”
- Invocación remota
- Si su aplicación realiza invocaciones remotas todavía puede utilizar JNDI para buscar un proxy para su bean e invocar en ese proxy retornado. Para mayor información sobre la sintaxis requerida y los cambios en los espacios de nombres, consulte: Sección 3.2.10.1, “Migración de aplicaciones implementadas de JBoss EAP 5 que realizan invocaciones remotas en JBoss EAP 6”.
- Seam 2.2
- Si su aplicación usa Seam 2.2, consulte el siguiente tema para ver los cambios que necesita realizar: Sección 3.2.13.1, “Migración de archivadores Seam 2.2 a JBoss EAP 6”.
- Spring
- Si su aplicación usa Spring, consulte: Sección 3.2.14.1, “Migración de aplicaciones Spring”.
- Otros cambios que pueden tener impacto en su migración
- Para cambios adicionales en JBoss EAP 6 que pueden tener impacto en su aplicación, consulte: Sección 3.2.15.1, “Familiarícese con otros cambios que puedan afectar su migración”.
3.2.2. Cambios de JPA y Hibernate Copiar enlaceEnlace copiado en el portapapeles!
3.2.2.1. Actualizar aplicaciones que utilizan Hibernate y/o JPA Copiar enlaceEnlace copiado en el portapapeles!
Si su aplicación usa Hibernate o JPA lea las siguientes secciones y realice los cambios necesarios para migrar a JBoss EAP 6.
3.2.2.2. Configuración de cambios para las aplicaciones que usan Hibernate y JPA Copiar enlaceEnlace copiado en el portapapeles!
Si su aplicación contiene un archivo persistence.xml
o si el código usa las anotaciones @PersistenceContext
o @PersistenceUnit
, JBoss EAP 6 detecta esto durante la implementación y asume que la aplicación usa JPA. Implícitamente agrega Hibernate 4 además de otras pocas dependencias a la ruta de clase de su aplicación.
ClassNotFoundExceptions
cuando implementa su aplicación, puede tratar de resolverlas usando uno de los siguientes enfoques.
Importante
Procedimiento 3.13. Configure la aplicación
Copie las JARs Hibernate 3 requeridas en su biblioteca de aplicaciones.
Es posible que resuelva el problema copiando las JARs específicas de Hibernate 3 que contengan las clases que faltan en el directoriolib/
de la aplicación o agregándolas a la ruta de clases usando algún otro método. En algunos casos esto puede generarClassCastExceptions
u otros problemas de carga de clases debido al uso mezclado de las versiones de Hibernate. Si eso sucede entonces necesita usar el siguiente enfoque.Ordénele al servidor el utilizar sólamente bibliotecas Hibernate 3.
JBoss EAP 6 le permite empacar las jars del proveedor de persistencia Hibernate 3.5 (o posteriores) con la aplicación. Para ordenarle al servidor que use solamente las bibliotecas Hibernate 3 y excluir las bibliotecas Hibernate 4 necesita establecer eljboss.as.jpa.providerModule
comohibernate3-bundled
en elpersistence.xml
así:El implementador JPA (Java Persistence API) detectará la presencia de un proveedor de persistencia en la aplicación y usa las bibliotecas Hibernate 3. Para mayor información sobre las propiedades de persistencia JPA, consulte Sección 3.2.2.3, “Propiedades de la unidad de persistencia”.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Inhabiltar el caché de segundo nivel de Hibernate
El caché de segundo nivel para Hibernate 3 no presenta el mismo comportamiento con JBoss EAP 6 tal como lo hizo en lanzamientos anteriores. Si está utilizando el caché de segundo nivel de Hibernate con su aplicación, tiene que inhabilitarlo hasta que actualice a Hibernate 4. Para inhabilitar el caché de segundo nivel configure el<hibernate.cache.use_second_level_cache>
comofalse
en el archivopersistence.xml
.
3.2.2.3. Propiedades de la unidad de persistencia Copiar enlaceEnlace copiado en el portapapeles!
JBoss EAP 6 configura automáticamente las siguientes propiedades de configuración de Hibernate 4.x:
Nombre de la propiedad | Valor predeterminado | Propósito |
---|---|---|
hibernate.id.new_generator_mappings | true |
Esta configuración es relevante si usa
@GeneratedValue(AUTO) para generar valores de llaves de índice únicos para nuevas entidades. Las nuevas aplicaciones deben mantener el valor predeterminado de true . Puede que las aplicaciones existentes que utilizaron Hibernate 3.3.x necesiten cambiarlo a false para continuar utilizando un objeto de secuencia o un generador basado en tabla y mantener una compatibilidad retroactiva. La aplicación puede sobreescribir este valor en el archivo persistence.xml .
A continuación encontrará mayor información sobre este comportamiento.
|
hibernate.transaction.jta.platform | Instancia de la interfaz org.hibernate.service.jta.platform.spi.JtaPlatform |
Esta clase pasa el gestor de transacciones, la transacción del usuario y el registro de sincronización de transacciones a Hibernate.
|
hibernate.ejb.resource_scanner | Instancia de la interaz org.hibernate.ejb.packaging.Scanner |
Esta clase sabe como utilizar el creador de índices de la anotación de JBoss EAP 6 para brindar una implementación más rápida.
|
hibernate.transaction.manager_lookup_class |
Esta propiedad se borra si se encuentra en el persistence.xml ya que podría crear conflicto con
hibernate.transaction.jta.platform
| |
hibernate.session_factory_name | QUALIFIED_PERSISTENCE_UNIT_NAME |
Esto está configurado con el nombre de la aplicación + nombre de la unidad de persistencia. La aplicación puede especificar un valor diferente, pero debe ser único a través de todas las implementaciones de la aplicación en la instancia de JBoss EAP 6.
|
hibernate.session_factory_name_is_jndi | false |
Este se configura solamente si la aplicación no especificó un valor para el
hibernate.session_factory_name .
|
hibernate.ejb.entitymanager_factory_name | QUALIFIED_PERSISTENCE_UNIT_NAME |
Esto está configurado con el nombre de la aplicación + nombre de la unidad de persistencia. La aplicación puede especificar un valor diferente, pero debe ser único a través de todas las implementaciones de la aplicación en la instancia de JBoss EAP 6.
|
new_generator_mappings
se configura como true
:
@GeneratedValue(AUTO)
mapea aorg.hibernate.id.enhanced.SequenceStyleGenerator
.@GeneratedValue(TABLE)
mapea aorg.hibernate.id.enhanced.TableGenerator
.@GeneratedValue(SEQUENCE)
mapea aorg.hibernate.id.enhanced.SequenceStyleGenerator
.
new_generator_mappings
se configura como false
:
@GeneratedValue(AUTO)
mapea a Hibernate "native".@GeneratedValue(TABLE)
mapea aorg.hibernate.id.MultipleHiLoPerTableGenerator
.@GeneratedValue(SEQUENCE)
mapea a Hibernate "seqhilo".
Las siguientes propiedades JPA se soportan en la definición de la unidad de persistencia en el archivo persistence.xml
:
Nombre de la propiedad | Valor predeterminado | Propósito |
---|---|---|
jboss.as.jpa.providerModule | org.hibernate |
El nombre del módulo proveedor de persistencia.
El valor debe ser
hibernate3-bundled si las JARs de Hibernate 3 se encuentran en el archivador de la aplicación.
Si un proveedor de persistencia se empaca con la aplicación entonces este valor debe ser
application .
|
jboss.as.jpa.adapterModule | org.jboss.as.jpa.hibernate:4 |
El nombre de las clases de integración que ayudan a JBoss EAP 6 a funcionar con el proveedor de persistencia.
Los valores válidos actuales son:
|
3.2.2.4. Actualización de su aplicación Hibernate 3 para utilizar Hibernate 4 Copiar enlaceEnlace copiado en el portapapeles!
Cuando actualiza su aplicación para utilizar Hibernate 4, algunas actualizaciones son generales y aplican sin importar la versión de Hibernate que actualmente la aplicación utiliza. Para otras actualizaciones tiene que determinar la versión que la aplicación utiliza actualmente.
Procedimiento 3.14. Actualización de la aplicación para utilizar Hibernate 4
- El comportamiento predeterminado del generador de secuencias de autoincremento cambió en JBoss EAP 6. Para mayor información, consulte Sección 3.2.2.5, “Preservar el comportamiento existente del valor auto generado de la identidad de Hibernate”.
- Determine la versión de Hibernate que la aplicación utiliza actualmente y seleccione el procedimiento de actualización correcto.
- Consulte Sección 3.2.2.8, “Modificación de las propiedades de persistencia para las aplicaciones Hibernate y Seam migradas que ejecutan en un entorno con clústers” si planea ejecutar su aplicación en un entorno con clústers.
3.2.2.5. Preservar el comportamiento existente del valor auto generado de la identidad de Hibernate Copiar enlaceEnlace copiado en el portapapeles!
hibernate.id.new_generator_mappings
que dirige la manera en que la identidad o las columnas de secuencia se generan al utilizar @GeneratedValue
. En JBoss EAP 6, el valor predeterminado para esta propiedad se configura así:
- Cuando implementa una aplicación Hibernate nativa, el valor predeterminado es
false
. - Cuando implementa una aplicación JPA, el valor predeterminado es
true
.
Las nuevas aplicaciones que usan la anotación @GeneratedValue
deben configurar el valor para la propiedad hibernate.id.new_generator_mappings
como true
. Esta es la configuración preferida ya que es más portábtil a través de diferentes bases de datos. En la mayoría de los casos es más eficiente y el algunos casos aborda la compatibilidad con la especificación JPA 2.
- Para las nuevas aplicaciones JPA, JBoss EAP 6 por defecto utiliza la propiedad
hibernate.id.new_generator_mappings
comotrue
y no se debe cambiar. - Para las nuevas aplicaciones Hibernate nativas, JBoss EAP 6 por defecto utiliza la propiedad
hibernate.id.new_generator_mappings
comofalse
. Debe establecer esta propiedad comotrue
.
Las aplicaciones existentes que usan la anotación @GeneratedValue
deben asegurarse de utilizar el mismo generador para crear valores de llaves primarias para nuevas entidades cuando la aplicación se migra a JBoss EAP 6.
- Para las aplicaciones JPA existentes, JBoss EAP 6 por defecto utiliza la propiedad
hibernate.id.new_generator_mappings
comotrue
. Debe configurar esta propiedad comofalse
en el archivopersistence.xml
. - Para aplicaciones nativas Hibernate, JBoss EAP 6 por defecto usa
hibernate.id.new_generator_mappings
comofalse
y no se debe cambiar.
3.2.2.6. Migración de su aplicación Hibernate 3.3.x a Hibernate 4.x Copiar enlaceEnlace copiado en el portapapeles!
Mapeo de los tipos Hibernate
text
aJDBC LONGVARCHAR
En versiones de Hibernate anteriores a 3.5, el tipotext
se mapeaba aJDBC CLOB
. Se agregó un nuevo tipo Hibernate,materialized_clob
, en Hibernate 4 para mapear propiedadesString
Java aJDBC CLOB
. Si su aplicación tiene propiedades configuradas comotype="text"
que se planean mapear aJDBC CLOB
, tiene que hacer una de las siguientes:- Si su aplicación usa archivos de mapeo hbm cambie la propiedad a
type="materialized_clob"
. - Si su aplicación usa anotaciones, debe reemplazar
@Type(type = "text")
con@Lob
.
Revise el código para encontrar los cambios en los tipos de valor retornados
Las proyeciones de criterios de agregación numéricos ahora retornan el mismo tipo de valor que sus contrapartes HQL. Por lo tanto, los tipos de retorno de las siguientes proyecciones enorg.hibernate.criterion
cambiaron.- Debido a los cambios en
CountProjection
,Projections.rowCount()
,Projections.count(propertyName)
yProjections.countDistinct(propertyName)
, las proyeccionescount
ycount distinct
ahora retornan un valorLong
. - Debido a los cambios en
Projections.sum(propertyName)
, las proyeccionessum
ahora retornan un tipo de valor que depende del tipo de la propiedad.Nota
Si no modifica el código de su aplicación se puede generar unajava.lang.ClassCastException
.- Para las propiedades mapeadas como los tipos de números enteros primitivos, Long, Short o Integer se retorna una valor Long;
- Para las propiedades mapeadas como tipos de de punto flotante primitivo, Float o Double se retorna un valor Double.
3.2.2.7. Migración de su aplicación Hibernate 3.5.x a Hibernate 4.x Copiar enlaceEnlace copiado en el portapapeles!
- Fusione AnnotationConfiguration en la configuración.Aunque
AnnotationConfiguration
ya no se utiliza no debe afectar su migración.Si todavía está usando un archivohbm.xml
debe tener en cuenta de que JBoss EAP 6 ahora usaorg.hibernate.cfg.EJB3NamingStrategy
enAnnotationConfiguration
en lugar de laorg.hibernate.cfg.DefaultNamingStrategy
que se utilizaba en lanzamientos anteriores. Esto puede generar coincidencias equivocadas en los nombres. Si depende de que la estrategia de nombrado use por defecto el nombre de una tabla de asociación (muchos-a-muchos y colecciones de elementos) entonces es posible que vea este problema. Para resolver este problema le puede decir a Hibernate que use laorg.hibernate.cfg.DefaultNamingStrategy
de legado llamandoConfiguration#setNamingStrategy
y pasándoleorg.hibernate.cfg.DefaultNamingStrategy#INSTANCE
. - Modifique los espacios de nombres para que cumplan con los requerimientos de los nuevos nombres de los archivos Hibernate DTD tal como se observa en la siguiente tabla.
Expand Tabla 3.5. Tabla de mapeo de espacios de nombres DTD Espacio de nombre DTD anterior Nuevo espacio de nombre DTD http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd - Modificación de las variables de entorno.
- Si está usando Oracle y usando las propiedades
materialized_clob
omaterialized_blob
entonces la variable global del entornohibernate.jdbc.use_streams_for_binary
se debe configurar como verdadera. - Si está usando PostgreSQL y las propiedades
CLOB
orBLOB
entonces la variable global del entornohibernate.jdbc.use_streams_for_binary
se debe configurar como falsa.
3.2.2.8. Modificación de las propiedades de persistencia para las aplicaciones Hibernate y Seam migradas que ejecutan en un entorno con clústers Copiar enlaceEnlace copiado en el portapapeles!
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize .... Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize
....
Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]
persistence.xml
. Para las aplicaciones nativas Hibernate API, este es el archivo hibernate.cfg.xml
.
Procedimiento 3.15. Configure las propiedades de persistencia para ejecutar en un entorno con clústers
- Establezca el valor
hibernate.session_factory_name
con un nombre único. Este nombre debe ser único a través de todas las implementaciones de la aplicación en la instancia de JBoss EAP 6. Por ejemplo:<property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>
<property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Establezca el valor
hibernate.ejb.entitymanager_factory_name
con un nombre único. Este nombre debe ser único a través de todas las implementaciones de la aplicación en la instancia de JBoss EAP 6. Por ejemplo:<property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>
<property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2.2.9. Actualización de su aplicación para que cumpla con los requerimientos de la especificación JPA 2.0 Copiar enlaceEnlace copiado en el portapapeles!
La especificación JPA 2.0 requiere que un contexto de persistencia no se pueda propagar por fuera de una transacción JTA. Si su aplicación usa solo contextos de persistencia con ámbitos de transacciones entonces el comportamiento es el mismo en JBoss EAP 6 tal como lo era en versiones anteriores del servidor de aplicaciones y no se requieren cambios. Sin embargo, si su aplicación usa un contexto de persistencia extendido (XPC) para permitir colas o agrupamiento de modificaciones de datos, es posible que necesite realizar cambios a su aplicación.
Si su aplicación tiene un bean de sesión con estado, Bean1
, que usa un contexto de persistencia extendido y llama a un bean de sesión sin estado, Bean2
, que usa un contexto de persistencia con ámbito de transacciones entonces puede esperar que el siguiente comportamiento tenga lugar:
- Si
Bean1
inicia una transacción JTA y realiza la invocación de métodoBean2
con la transacción JTA activa, el comportamiento en JBoss EAP 6 es el mismo que en lanzamientos anteriores y no se necesita ningún cambio. - Si
Bean1
no inicia una transacción JTA y realiza la invocación del métodoBean2
, JBoss EAP 6 no propaga el contexto de persistencia extendido enBean2
. Este comportamiento es diferente de lanzamientos anteriores los cuales si propagaban el contexto de persistencia extendido enBean2
. Si su aplicación espera que el contexto de persistencia extendido sea propagado al bean con el gestor de entidades transaccional, necesita cambiar su aplicación para que realice la invocación dentro de una transacción JTA activa.
3.2.2.10. Reemplace el caché de segundo nivel JPA/Hibernate con Infinispan Copiar enlaceEnlace copiado en el portapapeles!
JBoss Cache se reemplazó con Infinispan para el caché de segundo nivel (2LC). Esto requiere un cambio al archivo persistence.xml
. La sintaxis es un poco diferente dependiendo de si está utilizando el caché de segundo nivel JPA o Hibernate. Estos ejemplos asumen que está utilizando Hibernate.
persistence.xml
en JBoss EAP 5.x.
Procedimiento 3.16. Modifique el archivo persistence.xml
para usar Infinispan
Configure Infinispan para una aplicación JPA en JBoss EAP 6
Esta es la manera de especificar propiedades para lograr la misma configuración para una aplicación JPA usando Infinispan en JBoss EAP 6:Además necesita especificar un<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow shared-cache-mode
con el valor deENABLE_SELECTIVE
oALL
así:ENABLE_SELECTIVE
es el valor predeterminado y recomendado. Significa que las entidades ya no se ponen en el caché a menos de que las marque explícitamente como para usar el caché.<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ALL
significa que las entidades siempre se ponen en el caché incluso si las marca para no ponerlas en el caché.<shared-cache-mode>ALL</shared-cache-mode>
<shared-cache-mode>ALL</shared-cache-mode>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Configure Infinispan para una aplicación Hibernate nativa en JBoss EAP 6
Esta es la manera de especificar la misma configuración para una aplicación nativa Hibernate usando Infinispan con JBoss EAP 6:También tiene que agregar las siguientes dependencias al archivoCopy to Clipboard Copied! Toggle word wrap Toggle overflow MANIFEST.MF
:Manifest-Version: 1.0 Dependencies: org.infinispan, org.hibernate
Manifest-Version: 1.0 Dependencies: org.infinispan, org.hibernate
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2.2.11. Propiedades caché de Hibernate Copiar enlaceEnlace copiado en el portapapeles!
Nombre de la propiedad | Descripción |
---|---|
hibernate.cache.region.factory_class |
El nombre de la clase de un
CacheProvider personalizado.
|
hibernate.cache.use_minimal_puts |
Boolean. Optimiza la operación caché de segundo nivel para minimizar las escrituras con el costo de lecturas más frecuentes. Esta configuración es más útil para los cachés en clústers y en Hibernate3 está habilitado por defecto para las implementaciones de caché en clústers.
|
hibernate.cache.use_query_cache |
Boolean. Habilita el caché de solicitudes. Las solicitudes individuales todavía se tienen que configurar para utilizar el caché.
|
hibernate.cache.use_second_level_cache |
Boolean. Utilizado para deshabilitar completamente el caché de segundo nivel, el cual está habilitado por defecto para las clases que especifican un mapeo
<cache> .
|
hibernate.cache.query_cache_factory |
El nombre de clase de una interfaz
QueryCache personalizada. El valor predeterminado es el StandardQueryCache incluído.
|
hibernate.cache.region_prefix |
Un prefijo para utilizar para los nombres de regiones caché de segundo nivel.
|
hibernate.cache.use_structured_entries |
Boolean. Fuerza a Hibernate a almacenar datos en el caché de segundo nivel en un formato más fácil de entender.
|
hibernate.cache.default_cache_concurrency_strategy |
Configuración utilizada para brindar el nombre del
org.hibernate.annotations.CacheConcurrencyStrategy predeterminado a utilizar cuando se utiliza @Cacheable o @Cache . @Cache(strategy="..") para sobreescribir este valor predeterminado.
|
3.2.2.12. Migración a Hibernate Validator 4 Copiar enlaceEnlace copiado en el portapapeles!
Hibernate Validator 4.x es un código base completamente nuevo que implementa JSR 303 - Bean Validation. El proceso de migración de Validator 3.x a 4.x es simple, pero hay unos pocos cambios que tiene que realizar cuando migre su aplicación.
Procedimiento 3.17. Es posible que tenga que realizar una o más de las siguientes tareas
Acceder el ValidatorFactory predeterminado
JBoss EAP 6 enlaza un ValidatorFactory predeterminado al contexto JNDI bajo el nombrejava:comp/ValidatorFactory
.Comprender la validación disparada del ciclo de vida
Cuando se utiliza junto con Hibernate Core 4, Hibernate Core habilita automáticamente la validación basada en el ciclo de vida.- La validación ocurre en las operaciones de las entidades
INSERT
,UPDATE
yDELETE
operations. - Puede configurar los grupos a validarse por tipo de evento usando las siguientes propiedades:Los valores de estas propiedades son los nombres de las clases completamente calificadas de los grupos a validar.
javax.persistence.validation.group.pre-persist
,javax.persistence.validation.group.pre-update
yjavax.persistence.validation.group.pre-remove
.
Los grupos de validación son una nueva funcionalidad de la especificación de la validación de beans. Si no quiere tomar ventaja de esta nueva funcionalidad, no necesita realizar cambios cuando migre a Hibernate Validator 4. - Puede inhabilitar la validación basada en el ciclo de vida configurando la propiedad
javax.persistence.validation.mode
comonone
. Los otros valores válidos para esta propiedad sonauto
(predeterminado),callback
yddl
.
Configure su aplicación para usar la validación manual
- Si quiere controlar manualmente la validación, puede crear un validador de una de las siguientes maneras:
- Cree una instancia
Validator
de laValidatorFactory
usando el métodogetValidator()
. - Las instancias del validador de inyección en su EJB, bean CDI o cualquier otro recurso Java EE inyectable.
- Puede utilizar el
ValidatorContext
retornado por elValidatorFactory.usingContext()
para personalizar la instancia de su validador. Usando esta API puede configurar unMessageInterpolator
,TraverableResolver
yConstraintValidatorFactory
personalizados. Estas interfaces se especifican en la especificación de la validación del bean y son nuevas para Hibernate Validator 4.
Modifique el código para utilizar las nuevas restricciones de validación del bean
Las nuevas restricciones de validación a nivel del bean requieren cambios en el código cuando migra a Hibernate Validator 4.- Para actualizar un Hibernate Validator 4, tiene que usar las restricciones en los siguientes paquetes:
javax.validation.constraints
org.hibernate.validator.constraints
- Todas las restricciones que existían en Hibernate Validator 3 todavía están disponibles en Hibernate Validator 4. Para utilizarlas necesita importar la clase especificada y en algunos casos, cambiar el nombre o tipo del parámetro de restricción.
Utilizar restricciones personalizadas
En Hibernate Validator 3, una restricción personalizada necesitaba implementar la interfazorg.hibernate.validator.Validator
. En Hibernate Validator 4, necesita implementar la interfazjavax.validation.ConstraintValidator
. Esta interfaz contiene los mismo métodosinitialize()
andisValid()
que la interfaz anterior, sin embargo, la firma del método cambió. Además, la modificaciónDDL
ya no se soporta en Hibernate Validator 4.
3.2.3. Cambios JSF Copiar enlaceEnlace copiado en el portapapeles!
3.2.3.1. Habiltar aplicaciones para utilizar versiones anteriores de JSF Copiar enlaceEnlace copiado en el portapapeles!
Si su aplicación usa una versión más antigua de JSF entonces no necesita actualizar a JSF 2.0. En lugar puede crear un archivo jboss-deployment-structure.xml
para solicitar que JBoss EAP 6 use JSF 1.2 en lugar de JSF 2.0 con la implementación de su aplicación. Este descriptor de implementación específico de JBoss se utiliza para controlar la carga de clases y se encuentra en el directorio META-INF/
o WEB-INF/
de su WAR o en el directorio META-INF/
de su EAR.
jboss-deployment-structure.xml
que agrega una dependencia para el módulo JSF 1.2 y excluye o previene la carga automática del módulo JSF 2.0.
3.2.4. Cambios de los servicios web Copiar enlaceEnlace copiado en el portapapeles!
3.2.4.1. Cambios de los servicios web Copiar enlaceEnlace copiado en el portapapeles!
- Cambios del proyecto API JBossWS
- SPI y los componentes comunes fueron refactorizados en JBossWS 4. La siguiente tabla lista los cambios de empaque y API que pueden afectar la migración de su aplicación.
Expand Tabla 3.7. Propiedades del controlador de registro de tamaño JAR antigua Paquete antiguo Nueva JAR Nuevo paquete JBossWS SPI org.jboss.wsf.spi.annotation.* JBossWS API org.jboss.ws.api.annotation.* JBossWS SPI org.jboss.wsf.spi.binding.* JBossWS API org.jboss.ws.api.binding.* JBossWS SPI org.jboss.wsf.spi.management.recording.* JBossWS API org.jboss.ws.api.monitoring.* JBossWS SPI org.jboss.wsf.spi.tools.* JBossWS API org.jboss.ws.api.tools.* JBossWS SPI org.jboss.wsf.spi.tools.ant.* JBossWS API org.jboss.ws.tools.ant.* JBossWS SPI org.jboss.wsf.spi.tools.cmd.* JBossWS API org.jboss.ws.tools.cmd.* JBossWS SPI org.jboss.wsf.spi.util.ServiceLoader JBossWS API org.jboss.ws.api.util.ServiceLoader JBossWS Common org.jboss.wsf.common.* JBossWS API org.jboss.ws.common.* JBossWS Common org.jboss.wsf.common.handler.* JBossWS API org.jboss.ws.api.handler.* JBossWS Common org.jboss.wsf.common.addressing.* JBossWS API org.jboss.ws.api.addressing.* JBossWS Common org.jboss.wsf.common.DOMUtils JBossWS API org.jboss.ws.api.util.DOMUtils JBossWS Native org.jboss.ws.annotation.EndpointConfig JBossWS API org.jboss.ws.api.annotation.EndpointConfig - Anotación @WebContext
- En JBossWS 3.4.x, esta anotación se empacó como
org.jboss.wsf.spi.annotation.WebContext
en el proyecto JBossWS SPI. En JBossWS 4.0, esta anotación se movió aorg.jboss.ws.api.annotation.WebContext
en el proyecto JBossWS API. Si su aplicación incluye la dependencia obsoleta entonces tiene que reemplazar las importaciones y las dependencias en su código fuente de la aplicación y compilarlo frente a la nueva JAR JBossWS API.También hay un cambio en un atributo que no es retroactivo. El atributoString[] virtualHosts
se cambió aString virtualHost
. En JBoss EAP 6 se puede especificar solo un host virtual por implementación. Si múltiples webservices usan la anotación@WebContext
entonces el valor virtualHost debe ser idéntico para todos los puntos finales definidos en el archivador de implementación. - Configuración del punto final
- JBossWS 4.0 proporciona integración de la pila de servicios web JBoss con la mayoría de los módulos del proyecto Apache CXF. La capa de integración permite el uso de APIs de servicios web estándares, incluyendo JAX-WS. También permite el uso de funcionalidades avanzadas de Apache CFX por encima del contenedor JBoss EAP 6 sin requirir una configuración compleja.El subsistema
webservice
en la configuración de dominio de JBoss EAP 6 incluye configuraciones del punto final predefinidas. También puede definir sus propias configuraciones de punto final predefinidas. La anotación@org.jboss.ws.api.annotation.EndpointConfig
se utiliza para hacer referencia a una configuración de punto final dada.Para obtener mayor información sobre cómo configurar puntos finales de servicios web en el servidor JBoss, consulte el capítulo titulado JAX-WS Web Services en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. - Descriptor de implementación jboss-webservices.xml
- JBossWS 4.0 introduce un nuevo descriptor de implementación para configurar servicios web. El archivo
jboss-webservices.xml
proporciona información adicional para la implementación dada y reemplaza parcialmente el archivo obsoletojboss.xml
.Para las implementaciones de servicios web EJB, la ubicación esperada del archivo descriptorjboss-webservices.xml
es en el directorioMETA-INF/
. Para los puntos finales del servicio web EJB y POJO agrupados en un archivo WAR, la ubicación esperada del archivojboss-webservices.xml
es en el directorioWEB-INF/
.El siguiente es un ejemplo de un archivo descriptorjboss-webservices.xml
y una tabla describiendo los elementos.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand Tabla 3.8. Descripción del elemento del archivo jboss-webservice.xml Nombre del elemento Descripción context-rootUtilizado para personalizar la raíz contexto de la implementación de los servicios web.config-nameconfig-fileUtilizado para asociar la implementación de un punto final con la configuración del punto final dado. Las configuraciones del punto final se especifican en el archivo de configuración referenciado o en el subsistemawebservices
de la configuración del dominio.propiedadUtilizado para configurar parejas de valores de nombres de propiedades simples para configurar el comportamiento de la pila de los servicios web.port-componentUtilizado para personalizar la URI de destino del punto final EJB o para configurar las propiedades relacionadas con la seguridad.webservice-descriptionUtilizado para personalizar o sobreescribir la ubicación publicada WSDL del servicio web.
3.2.5. Cambios JAX-RS y RESTEasy Copiar enlaceEnlace copiado en el portapapeles!
3.2.5.1. Configure los cambios de JAX-RS y RESTEasy Copiar enlaceEnlace copiado en el portapapeles!
web.xml
y reemplazarlo con una de las siguientes opciones:
- La subclase
javax.ws.rs.core.Application
y use la anotación@ApplicationPath
.Esta es la opción más fácil y no requiere ninguna configuración xml. Simplemente cree una subclase dejavax.ws.rs.core.Application
en su aplicación y anótela con la ruta en donde quiere poner disponibles sus clases JAX-RS. Por ejemplo:@ApplicationPath("/mypath") public class MyApplication extends Application { }
@ApplicationPath("/mypath") public class MyApplication extends Application { }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En el ejemplo anterior, sus recursos JAX-RS están disponibles en la ruta/MY_WEB_APP_CONTEXT/mypath/
.Nota
Note que la ruta se debe especificar como/mypath
no/mypath/*
. No debe haber espacios, barras oblicuas o asteriscos. - Cree una subclase de
javax.ws.rs.core.Application
y use el archivoweb.xml
para configurar el mapeo JAX-RS.Si no desea usar la anotación@ApplicationPath
entonces todavía necesita crear la subclase dejavax.ws.rs.core.Application
. Luego puede configurar el mapeo JAX-RS en el archivoweb.xml
. Por ejemplo:public class MyApplication extends Application { }
public class MyApplication extends Application { }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <servlet-mapping> <servlet-name>com.acme.MyApplication</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>com.acme.MyApplication</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En el ejemplo anterior, sus recursos JAX-RS están disponibles en la ruta/MY_WEB_APP_CONTEXT/hello
.Nota
También puede utilizar este enfoque para sobreescribir una ruta de una aplicación que se configuró usando la anotación@ApplicationPath
. - Modifique el archivo
web.xml
.Si no quiere crear subclases deApplication
entonces puede configurar el mapeo JAX-RS en el archivoweb.xml
así:<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En el ejemplo anterior, sus recursos JAX-RS están disponibles en la ruta/MY_WEB_APP_CONTEXT/hello
.Nota
Cuando selecciona esta opción solo necesita agregar el mapeo. No necesita agregar el servlet correspondiente. El servidor es el responsable de agregar el servlet correspondiente automáticamente.
3.2.6. Cambios en el dominio de seguridad LDAP Copiar enlaceEnlace copiado en el portapapeles!
3.2.6.1. Configuración de los cambios del dominio de seguridad LDAP Copiar enlaceEnlace copiado en el portapapeles!
<application-policy>
en el archivo login-config.xml
. En JBoss EAP 6, el dominio de seguridad LDAP se configura en el elemento <security-domain>
en el archivo de configuración del servidor. Para un servidor autónomo, este es el archivo standalone/configuration/standalone.xml
. Si está ejecutando su servidor en un dominio administrado, este es el archivo domain/configuration/domain.xml
.
login-config.xml
en JBoss EAP 5:
Nota
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
3.2.7. Cambios de HornetQ Copiar enlaceEnlace copiado en el portapapeles!
3.2.7.1. HornetQ y NFS Copiar enlaceEnlace copiado en el portapapeles!
- El caché del cliente NFS Red Hat Enterprise Linux se debe deshabilitar.
Importante
Importante
libaio
esté instalado en el sistema Red Hat Enterprise Linux en donde está ejecutando JBoss EAP 6.
3.2.7.2. Configuración de un puente JMS para migrar mensajes JMS existentes a JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
3.2.7.3. Creación de un puente JMS Copiar enlaceEnlace copiado en el portapapeles!
Un puente JMS consume mensajes desde un tema o cola JMS fuente y los envía al tema o cola JMS destino, el cual usualmente se encuentra en un servidor diferente. Se puede utilizar como puente para los mensajes entre cualquier servidor JMS en tanto cumplan con los requerimientos de JMS 1.1. Los recursos JMS de destino y fuente se buscan utilizando JNDI y las clases clientes para la búsqueda JNDI se deben agrupan en un módulo. Luego el nombre del módulo se declara en la configuración del puente JMS.
Procedimiento 3.18. Creación de un puente JMS
Configuración del puente en el servidor JBoss EAP 5.x fuente
Para evitar conflictos en las clases entre lanzamientos tiene que seguir estos pasos para configurar el puente JMS en JBoss EAP 5.x. Los nombres del directorio SAR y el puente son arbitrarios y se pueden cambiar si así lo prefiere.- Cree un subdirectorio en el directorio de implementación de JBoss EAP 5 a contener el SAR, por ejemplo:
EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
. - Cree un subdirectorio llamado
META-INF
enEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
. - Cree un archivo
jboss-service.xml
en el diretcorioEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/
. Debe contener información similar al siguiente ejemplo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
El elementoload-repository
está presente para asegurar que el SAR tiene un cargador de clases aislado. También note que la búsqueda JNDI y el puente "destino" incluyen credenciales de seguridad para el usuario "jbossuser" con la contraseña "jbosspass". Esto se debe a que JBoss EAP 6 está asegurado por defecto. El usuario llamado "jbossuser" con contraseña "jbosspass" se creó en elApplicationRealm
con el rolguest
usando el scriptEAP_HOME/bin/add_user.sh
. - Copie las siguientes JARs del directorio
EAP_HOME/modules/system/layers/base/
en el directorioEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
. Reemplace cada VERSION_NUMBER con el número de la versión en su distribución de JBoss EAP 6.org/hornetq/main/hornetq-core-VERSION_NUMBER.jar
org/hornetq/main/hornetq-jms-VERSION_NUMBER.jar
org/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jar
org/jboss/logging/main/jboss-logging-VERSION_NUMBER.jar
org/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jar
org/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jar
org/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jar
org/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jar
org/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jar
org/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jar
org/jboss/netty/main/netty-VERSION_NUMBER.jar
org/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jar
org/jboss/xnio/main/xnio-api-VERSION_NUMBER.jar
org/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar
Nota
No copie simplementeEAP_HOME/bin/client/jboss-client.jar
ya que las clases API javax entrarán en conflicto con las de JBoss EAP JBoss 5.x.
Configuración del puente en el servidor JBoss EAP 6 destino
En JBoss EAP 6.1 y posteriores, el puente JMS se puede utilizar para transferir mensajes de cualquier servidor que cumpla con los requerimientos de JMS 1.1. Ya que los recursos JMS destino y fuente se buscan usando JNDI, las clases de búsqueda JNDI del proveedor de mensajería fuente o agente de mensajería se debe agrupar en un módulo JBoss. Los siguientes pasos utilizan el agente de mensajería ficticio 'MyCustomMQ' como ejemplo.- Cree el módulo JBoss para el proveedor de mensajería.
- Cree una estructura de directorio bajo
EAP_HOME/modules/system/layers/base/
para el nuevo módulo. El subdirectoriomain/
tendrá las JARs clientes y el archivomodule.xml
. El siguiente es un ejemplo de la estructura de directorio creada para el proveedor de mensajería MyCustomMQ:EAP_HOME/modules/system/layers/base/org/mycustommq/main/
- En el subdirectorio
main/
cree un archivomodule.xml
que contenga la definición del módulo para el proveedor de mensajería. El siguiente es un ejemplo delmodule.xml
creado para el proveedor de mensajería MyCustomMQ.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Copie las JARs del proveedor de mensajería requeridas para la búsqueda JNDI de los recursos fuente en el subdirectorio
main/
del módulo. La estructura del directorio para el módulo MyCustomMQ ahora se debe ver como la siguiente.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Configuración del puente JMS en el subsistema
messaging
del servidor JBoss EAP 6.- Antes de empezar, detenga el servidor y relice una copia de seguridad de los archivos de configuración del servidor. Si está ejecutando un servidor autónomo este es el archivo
EAP_HOME/standalone/configuration/standalone-full-ha.xml
. Si está ejecutando un dominio administrado, realice una copia de seguridad de los archivosEAP_HOME/domain/configuration/domain.xml
yEAP_HOME/domain/configuration/host.xml
. - Agregue el elemento
jms-bridge
al subsistemamessaging
en el archivo de configuración del servidor. Los elementossource
ytarget
proporcionan los nombres de los recursos JMS utilizados para búsquedas JNDI. Si se especifican las credencialesuser
ypassword
entonces se pasan como argumentos cuando se crea una conexión JMS.El siguiente es un ejemplo del elementojms-bridge
configurado para el proveedor de mensajería MyCustomMQ:En el ejemplo anterior, las propiedades JNDI se definen en el elementoCopy to Clipboard Copied! Toggle word wrap Toggle overflow context
para lasource
. Si se omite el elementocontext
como en el ejemplo anteriortarget
entonces los recursos JMS se buscan en la instancia local.
3.2.7.4. Migre su aplicación para usar HornetQ como proveedor JMS Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento 3.19. Antes de iniciar
- Apague el cliente y el servidor.
- Realice una copia de seguridad de los datos de JBoss Messaging. Los datos del mensaje se almacenan en tablas con el prefijo
JBM_
.
Procedimiento 3.20. Cambie su proveedor a HornetQ
Transferencia de configuraciones
Transfiera las configuraciones existentes de JBoss Messaging a la configuración de JBoss EAP 6. Las siguientes configuraciones se pueden encontrar en los descriptores de implementación que se encuentran en el servidor de mensajería de JBoss:- Configuración del servicio de fábricas de conexionesEsta configuración describe las fábricas de conexiones JMS implementadas con el servidor JBoss Messaging. JBoss Messaging configura las fábricas de conexiones en un archivo llamado
connection-factories-service.xml
, el cual se encuentra en el directorio de implementación del servidor de aplicaciones. - Configuración de destinoEsta configuración describe colas y temas JMS implementadas con el servidor JBoss Messaging. Por defecto, JBoss Messaging configura destinos en un archivo llamado
destinations-service.xml
, el cual se encuentra en el directorio de implementación del servidor de aplicaciones. - Configuración del servicio de puente de mensajesEsta configuración incluye los servicios de puente implementados con el servidor JBoss Messaging. Por defecto no se implementa ningún puente así que el nombre del archivo de implementación varía dependiendo de su instalación JBoss Messaging.
Modificación de su código de aplicación
Si el código de la aplicación usa JMS estándar, no se requieren cambios en el código. Sin embargo, si la aplicación se estará conectando a un clúster tiene que revisar cuidadosamente la documentación de HornetQ con relación a la semántica de los clústers. Los clústers están por fuera del ámbito de la especificación JMS y HornetQ y JBoss Messaging han tomado diferentes enfoques en sus respectivas implementaciones de la funcionalidad de clústers.Si la aplicación usa funcionalidades específicas para JBoss Messaging, tiene que modificar el código para utilizar las funcionalidades equivalentes disponibles en HornetQ.Para mayor información sobre cómo configurar la mensajería con HornetQ consulte Sección 3.2.7.5, “Configuración de la mensajería con HornetQ”Migrar los mensajes existentes
Mueva los mensajes que estén en la base de datos JBoss Messaging al diario HornetQ usando un puente JMS. Puede encontrar las instrucciones para configurar el puente JMS aquí: Sección 3.2.7.2, “Configuración de un puente JMS para migrar mensajes JMS existentes a JBoss EAP 6”.
3.2.7.5. Configuración de la mensajería con HornetQ Copiar enlaceEnlace copiado en el portapapeles!
standalone.xml
o domain.xml
. Sin embargo, es útil familiarizarse con los componentes de mensajería de los archivos de configuración predeterminados, en donde los ejemplos de la documentación que usan herramientas de administración proporcionan partes del archivo de configuración de referencia.
3.2.8. Cambios del uso de clústers Copiar enlaceEnlace copiado en el portapapeles!
3.2.8.1. Realizar cambios a su aplicación para uso de clústers Copiar enlaceEnlace copiado en el portapapeles!
Inicie JBoss EAP 6 con el uso de clústers habilitado
Para habilitar el uso de clústers en JBoss EAP 5.x, necesitaba iniciar sus instancias del servidor usando el perfilall
o alguna derivación de este así:EAP5_HOME/bin/run.sh -c all
$ EAP5_HOME/bin/run.sh -c all$ EAP5_HOME/bin/run.sh -c all$ EAP5_HOME/bin/run.sh -c all
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En JBoss EAP 6, el método para habilitar el clúster depende de si los servidores son autónomos o si están ejecutando en un dominio administrado.Habilite el clúster para los servidores ejecutando en un dominio administrado
Para habilitar el uso de clústers para los servidores iniciados usando el controlador de dominio, actualice sudomain.xml
y designe un grupo de servidores para utilizar el perfilha
y el grupo de enlace de socketsha-sockets
. Por ejemplo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Habilitación del uso de clústers para servidores autónomos
Para habilitar los clústers para los servidores autónomos inicie el servidor usando el archivo de configuración apropiado así:EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME
$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Especifique la dirección de enlace
En JBoss EAP 5.x usualmente indicaría la dirección de enlace utilizada para el uso de clústers utilizando el argumento de la línea de comandos-b
así:EAP5_HOME/bin/run.sh -c all -b 192.168.0.2
$ EAP5_HOME/bin/run.sh -c all -b 192.168.0.2$ EAP5_HOME/bin/run.sh -c all -b 192.168.0.2$ EAP5_HOME/bin/run.sh -c all -b 192.168.0.2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow JBoss EAP 6 enlaza sockets a las direcciones IP e interfaces que se encuentran en los elementos<interfaces>
en los archivosstandalone.xml
,domain.xml
yhost.xml
. Las configuraciones estándar que se envían junto con JBoss EAP incluyen dos configuraciones de interfaz:Estas configuraciones de interfaz usan los valores de las propiedades del sistemaCopy to Clipboard Copied! Toggle word wrap Toggle overflow jboss.bind.address.management
yjboss.bind.address
. Si estas propiedades del sistema no se establecen entonces se utiliza el valor predeterminado127.0.0.1
para cada valor.También puede especificar la dirección de enlace como un argumento de la línea de comandos cuando inicia el servidor o puede definirla explícitamente dentro del archivo de configuración del servidor JBoss EAP 6.- Especifique el argumento de enlace en la línea de comandos cuando incia el servidor autónomo JBoss EAP.El siguiente es un ejemplo de cómo especificar la dirección de enlace en la línea de comandos para un servidor autónomo:
EAP_HOME/bin/standalone.sh -Djboss.bind.address=127.0.0.1
EAP_HOME/bin/standalone.sh -Djboss.bind.address=127.0.0.1EAP_HOME/bin/standalone.sh -Djboss.bind.address=127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
También puede utilizar el argumento-b
, el cual es un atajo para-Djboss.bind.address=127.0.0.1
:EAP_HOME/bin/standalone.sh -b=127.0.0.1
EAP_HOME/bin/standalone.sh -b=127.0.0.1EAP_HOME/bin/standalone.sh -b=127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El formato de la sintaxis de JBoss EAP 5 todavía se soporta:Note que el argumentoEAP_HOME/bin/standalone.sh -b 127.0.0.1
EAP_HOME/bin/standalone.sh -b 127.0.0.1EAP_HOME/bin/standalone.sh -b 127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -b
solo cambia la interfazpublic
. No afecta la interfazmanagement
. - Especifique la dirección de enlace en el archivo de configuración del servidor.Para los servidores ejecutando en un dominio administrado, especifique las direcciones de enlace en el archivo
domain/configuration/host.xml
. Para los servidores autónomos especifique las direcciones de enlace en el archivostandalone-ha.xml
.En el siguiente ejemplo, la interfazpublic
se especifica como la interfaz predeterminada para todos los sockets dentro del grupo de enlace de socketsha-sockets
.Copy to Clipboard Copied! Toggle word wrap Toggle overflow <socket-binding-groups> <socket-binding-group name="ha-sockets" default-interface="public"> <!-- ... --> </socket-binding-group> </socket-binding-groups>
<socket-binding-groups> <socket-binding-group name="ha-sockets" default-interface="public"> <!-- ... --> </socket-binding-group> </socket-binding-groups>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
Si especifica la dirección de enlace como un valor definido en lugar de una propiedad del sistema en el archivo de configuración entonces no puede sobreescribirlo con un argumento de la línea de comandos.
Configure
jvmRoute
para soportar mod_jk y mod_proxyEn JBoss EAP 5, el servidor webjvmRoute
se configuraba usando una propiedad en el archivoserver.xml
. En JBoss EAP 6, el atributojvmRoute
se configura en el subsistema web del archivo de configuración del servidor usando el atributoinstance-id
así:El {JVM_ROUTE_SERVER} anterior se debe reemplazar por el id del servidor jvmRoute server.<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}">
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}">
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Elinstance-id
también se puede configurar usando la consola de administración.Especifique la dirección y puerto multicast
En JBoss EAP 5.x puede especificar la dirección y puerto multicast utilizados para la comunicación interna del clúster usando los argumentos de la línea de comandos-u
y-m
respectivamente, así:EAP5_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688
$ EAP5_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688$ EAP5_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En JBoss EAP 6, la dirección multicast y el puerto utilizado para la comunicación intra-clúster se definen por medio del enlace de socket referenciado por la pila del protocolo JGroups relevante así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si prefiere especificar la dirección multicast y el puerto en la línea de comandos, puede definir la dirección multicast y los puertos como propiedades del sistema y luego usar esas propiedades en la línea de comandos cuando inicie el servidor. En el siguiente ejemplo,Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss.mcast.addr
es el nombre de la variable para la dirección multicast yjboss.mcast.port
es el nombre de la variable para el puerto.Luego puede iniciar su servidor utilizando los siguientes argumentos de la línea de comandos:<socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/>
<socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688
$ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688$ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688$ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Use una pila opcional del protocolo
En JBoss EAP 5.x, puede manipular la pila predeterminada del protocolo utilizada para todos los servicios de clúster usando la propiedad del sistemajboss.default.jgroups.stack
.EAP5_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp
$ EAP5_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp$ EAP5_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp$ EAP5_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En JBoss EAP 6, la pila predeterminada del protocolo es definida por el subsistema JGroups dentro dedomain.xml
ostandalone-ha.xml
:<subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp"> <stack name="udp"> <!-- ... --> </stack> </subsystem>
<subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp"> <stack name="udp"> <!-- ... --> </stack> </subsystem>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reemplazar la replicación de compañeros
JBoss EAP 5.x utilizaba JBoss Cache Buddy Replication para eliminar la replicación de datos en todas las instancias en un clúster.En JBoss EAP 6, la replicación de compañeros fue reemplazada por el caché distribuído de Infinispan también conocido como el modoDIST
. La distribución es un modo de uso de clústers poderoso, el cual le permite a Infinispan el escalar linearmente cuando se agregan mas servidores al clúster. El siguiente es un ejemplo de cómo configurar el servidor para utilizar el modo de caché DIST.- Abra una línea de comandos e inicie el servidor con el perfil HA o Full Profile, por ejemplo:
EAP_HOME/bin/standalone.sh -c standalone-ha.xml
EAP_HOME/bin/standalone.sh -c standalone-ha.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Abra otra línea de comandos y conéctese al CLI de administración.
- Para Linux, ingrese lo siguiente en la línea de comandos:
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Para Windows, ingrese lo siguiente en la línea de comandos:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
C:\>EAP_HOME\bin\jboss-cli.bat --connect
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Debe ver la siguiente respuesta:Conectado a un controlador autónomo en localhost:9999
Conectado a un controlador autónomo en localhost:9999
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Emita los siguientes comandos:
/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist) /subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=3) :reload
/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist) /subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=3) :reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Debe ver la siguiente respuesta después de cada comando:"outcome" => "success"
"outcome" => "success"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Estos comandos modifican el elementodist
<distributed-cache>
en la configuraciónweb
<cache-container>
en el subsistemainfinispan
del archivostandalone-ha.xml
así:Para mayor información consulte el capítulo titulado Clústers en aplicaciones web en la Guía de desarrollo para JBoss EAP 6 que se encuentra en el portal del cliente en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2.8.2. Implementación de un Singleton HA Copiar enlaceEnlace copiado en el portapapeles!
El siguiente procedimiento demuestra la manera de implementar un servicio envuelto con el decorador SingletonService y utilizado como un servicio singleton a nivel de clúster. El servicio activa un temporizador programado, el cual se inicia una vez en el clúster.
Procedimiento 3.21. Implementación de un servicio Singleton HA
Escriba la aplicación del servicio singleton HA.
El siguiente es un ejemplo simple de unService
envuelto con el decoradorSingletonService
para ser implementado como un servicio singleton. Puede encontrar un ejemplo completo en la guía de inicio rápido decluster-ha-singleton
que se envía junto con Red Hat JBoss Enterprise Application Platform 6. Esta guía de inicio rápido contiene todas las instrucciones para construir e implementar la aplicación.Crear un servicio.
El siguiente listado es un ejemplo de un servicio:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cree un activador que instala el
Service
como un singleton en clúster.El siguiente listado es un ejemplo de un activador Service que instala elHATimerService
como un servicio singleton en clúster:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
El código ejemplo anterior usa una clase,org.jboss.as.clustering.singleton.SingletonService
, que es parte de la API privada JBoss EAP. Una API pública se hará disponible en el lanzamiento EAP 7 y la clase privada ya no se utilizará, pero estas clases se mantendrán y estarán disponibles durante el ciclo de lanzamiento de EAP 6.x.Creación de un archivo ServiceActivator
Cree un archivo llamadoorg.jboss.msc.service.ServiceActivator
en el directorioresources/META-INF/services/
de la aplicación. Agregue una línea que contenga el nombre completamente calificado de la clase ServiceActivator creada en el paso anterior.org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivator
org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cree un bean Singleton que implementa un temporizador a utilizarse como temporizador singleton a nivel de clúster.
Este bean Singleton no debe tener una interfaz remota y no debe hacer referencia a su interfaz local desde otro EJB en ninguna aplicación. Esto evita una búsqueda por parte de un cliente u otro componente y se asegura de que el SingletonService tenga control total del Singleton.Creación de la interfaz del programador
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crear el bean Singleton que implementa el temporizador singleton a nivel de clúster.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Inicie cada instancia de JBoss EAP 6 con el clúster habilitado.
Para habilitar el uso de clústers para servidores autónomos, inicie cada servidor con el perfilHA
utilizando un nodo único y compensación de puertos para cada instancia.- Para Linux use la siguiente sintaxis de comandos para iniciar los servidores:
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ejemplo 3.1. Inicio de múltiples servidores autónomos en Linux
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1 EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1 $ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Para Microsoft Windows use la siguiente sintaxis de comandos para iniciar los servidores:
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ejemplo 3.2. Inicio de múltiples servidores autónomos en Microsoft Windows
C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1 C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1 C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Nota
Si prefiere no utilizar argumentos de la línea de comandos entonces puede configurar el archivostandalone-ha.xml
para cada instancia de servidor para enlazar en una interfaz por separado.Implemente la aplicación en los servidores
El siguiente comando Maven implementa la aplicación en un servidor autónomo ejecutando en los puertos predeterminados.mvn clean install jboss-as:deploy
mvn clean install jboss-as:deploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para implementar en servidores adicionales, pase el nombre del servidor. Si es un host diferente, pase el nombre del host y el número del puerto en la línea de comandos:mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099
mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Consulte el inicio rápidocluster-ha-singleton
que se envía junto con JBoss EAP 6 para ver los detalles de la implementación y configuración de Maven.
3.2.9. Cambios en la implementación de estilo de servicio Copiar enlaceEnlace copiado en el portapapeles!
3.2.9.1. Actualización de aplicaciones que utilizan las implementaciones de estilo del servicio Copiar enlaceEnlace copiado en el portapapeles!
Aunque JBoss EAP 6 ya no usa descriptores del estilo del servicio, el contenedor soporta estas implementaciones del estilo de servicio sin cambios en donde sea posible. Esto significa que si utilizó descriptores de implementación jboss-service.xml
o jboss-beans.xml
en su aplicación JBoss EAP 5.x, deben ejecutar con muy pocas modificaciones o ninguna en JBoss EAP 6. Puede continuar empacando los archivos en el EAR o SAR o puede poner los archivos directamente en el directorio de implementaciones. Si está ejecutando un servidor autónomo, el directorio de implementaciones se encuentra aquí: EAP_HOME/standalone/deployments/
. Si está ejecutando un dominio administrado entonces debe utilizar la consola o el CLI para implementar la aplicación.
3.2.10. Cambios de invocaciones remotas Copiar enlaceEnlace copiado en el portapapeles!
3.2.10.1. Migración de aplicaciones implementadas de JBoss EAP 5 que realizan invocaciones remotas en JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
En JBoss EAP 5, la interfaz remota EJB se enlazaba en JNDI por defecto bajo el nombre "ejbName/local" para las interfaces locales y "ejbName/remote" para las interfaces remotas. Luego la aplicación cliente buscaba el bean usando "ejbName/remote".
ejb:
BEAN_REFERENCE para acceso remoto a EJBs con la siguiente sintaxis.
ejb:
BEAN_REFERENCE es:
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>
ejb:
BEAN_REFERENCE es:
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful
<app-name>
- el nombre de la aplicación de las EJBs implementadas. Este es usualmente el nombre ear sin el sufijo .ear, sin embargo, el nombre se puede sobreescribir en el archivo application.xml. Si la aplicación no se implementa como un .ear, este valor es una cadena vacía. Asuma que este ejemplo no se implementaba como un EAR.<module-name>
- el nombre del módulo de las EJBs implementadas en el servidor. Este es usualmente el nombre jar de la implementación EJB sin el sufijo .jar, pero se puede sobreescribir usando el ejb-jar.xml. En este ejemplo, asuma que las EJBs se implementaban en una jboss-ejb-remote-app.jar así que el nombre del módulo es jboss-ejb-remote-app.<distinct-name>
- un nombre diferente opcional para la EJB. Este ejemplo no usa un nombre diferente así que utiliza una cadena vacía.<bean-name>
- por defecto, es el nombre simple de la clase de la clase de la implementación del bean.<fully-qualified-classname-of-the-remote-interface>
- el nombre de la clase completamente calificada de la vista remota.
Asuma que ha implementado los siguientes EJB sin estado en un servidor de JBoss EAP 6. Note que expone una vista remota para el bean.
final RemoteCalculator statefulRemoteCalculator = (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")
final RemoteCalculator statefulRemoteCalculator = (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")
3.2.10.2. Invocación de un bean de sesión remotamente usando JNDI Copiar enlaceEnlace copiado en el portapapeles!
ejb-remote
contiene proyectos Maven que demuestran esta funcionalidad. Los inicios rápidos contienen proyectos para los beans de sesión a implementarse y el cliente remoto. Los ejemplos de código a continuación se tomaron del proyecto del cliente remoto.
Prerrequisitos
- Ya debe tener un proyecto Maven creado listo para utilizar.
- Ya se agregó la configuración para el repositorio Maven de JBoss EAP 6.
- Los beans de sesión que quiere invocar ya están implementados.
- Los beans de sesión desplegados implementan las interfaces empresariales remotas.
- Las interfaces remotas empresariales de los beans de sesión están disponibles como una dependencia Maven. Si las interfaces remotas empresariales solo están disponibles como un archivo JAR entonces se recomienda el agregar la JAR a su repositorio Maven como un objeto. Consulte la documentación de Maven con relación a
install:install-file
para obtener indicaciones, http://maven.apache.org/plugins/maven-install-plugin/usage.html - Necesita saber el nombre de host y el puerto JNDI del servidor que actúa como host para los beans de sesión.
Procedimiento 3.22. Agregación de la configuración del proyecto Maven para la invocación remota de beans de sesión
Agregar las dependencias requeridas del proyecto
Elpom.xml
para el proyecto se debe actualizar para incluir las dependencias necesarias.Agregue el archivo
jboss-ejb-client.properties
La API cliente EJB de JBoss espera encontrar un archivo en la raíz del proyecto llamadojboss-ejb-client.properties
que contiene la información de la conexión para el servicio JNDI. Agregue este archivo al directoriosrc/main/resources/
de su proyecto con el siguiente contenido.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cambie el nombre del host y el puerto para que coincida con su servidor.4447
es el número de puerto predeterminado. Para una conexión segura configure la líneaSSL_ENABLED
comotrue
y borre el comentario de la líneaSSL_STARTTLS
. La interfaz remota en el contenedor soporta las conexiones seguras y no seguras usando el mismo puerto.Agregar dependencias para las interfaces empresariales remotas
Agregar las dependencias Maven alpom.xml
para las interfaces empresariales remotas de los beans de sesión.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Procedimiento 3.23. Obtenga un proxy bean usando JNDI e invoque métoodos del bean
Manejo de las excepciones verificadas
Dos de los métodos usados en el siguiente código (InitialContext()
ylookup()
) tienen una excepción verificada del tipojavax.naming.NamingException
. Estas llamadas de métodos pueden estar incluídas en un bloque try/catch que atrapeNamingException
o en un método que se declare para presentarNamingException
. El manual de inicio rápidoejb-remote
usa la segunda técnica.Cree un contexto JNDI
Un objeto del contexto JNDI proporciona el mecanismo para solicitar recursos del servidor. Cree un contexto JNDI usando el siguiente código:final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Las propiedades de conexión para el servicio JNDI se leen del archivojboss-ejb-client.properties
.Use el método lookup() del contexto JNDI para obtener un proxy bean
Invoque el métodolookup()
del proxy bean y pásele el nombre JNDI del bean de sesión que requiera. Esto retornará un objeto que se debe vaciar al tipo de la interfaz empresarial remota que contiene los métodos que quiere invocar.final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());
final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Los nombres JNDI de beans de sesión se definen utilizando una sintaxis especial. Para mayor información consulte Sección 3.2.10.3, “Referencia de nombrado JNDI EJB” .Invocación de métodos
Ahora que tiene un objeto bean proxy puede invocar cualquiera de los métodos que se encuentane en la interfaz empresarial remota.int a = 204; int b = 340; System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server"); int sum = statelessRemoteCalculator.add(a, b); System.out.println("Remote calculator returned sum = " + sum);
int a = 204; int b = 340; System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server"); int sum = statelessRemoteCalculator.add(a, b); System.out.println("Remote calculator returned sum = " + sum);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El bean proxy pasa la petición de la invocación del método al bean de sesión en el servidor, en donde se ejecuta. El resultado se retorna al bean proxy, el cual luego lo retorna al que realiza la llamada. La comunicación entre el bean proxy y el bean de sesión remoto es transparente para el que realiza la llamada.
3.2.10.3. Referencia de nombrado JNDI EJB Copiar enlaceEnlace copiado en el portapapeles!
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
<appName>
- Si el archivo JAR del bean de sesión se ha implementado dentro de un archivador empresarial (EAR) entonces este es el nombre de ese EAR. Por defecto, el nombre de un EAR es su nombre de archivo sin el sufijo
.ear
. El nombre de la aplicación también se puede sobreescribir en su archivoapplication.xml
. Si el bean de sesión no se implementa en un EAR entonces déjelo en blanco. <moduleName>
- El nombre del módulo es el nombre del archivo JAR en donde está implementado el bean de sesión. Por defecto, el nombre del archivo JAR es su nombre de archivo sin el sufijo
.jar
. El nombre del módulo también se puede sobreescribir en el archivoejb-jar.xml
del JAR. <distinctName>
- JBoss EAP 6 permite que cada implementación especifique un nombre opcional diferente. Si la implementación no tiene un nombre diferente entonces déjelo en blanco.
<beanName>
- El nombre del bean es el nombre de la clase del bean de sesión que se va a invocar.
<viewClassName>
- El nombre de clase de vista es el nombre de clase completamente calificado de la interfaz remota. Esto incluye el nombre del paquete de la interfaz.
?stateful
- El sufijo
?stateful
se requiere cuando el nombre JNDI se refiere a un bean de sesión con estado. No se incluye para otros tipos de beans.
3.2.11. Cambios de EJB 2.x Copiar enlaceEnlace copiado en el portapapeles!
3.2.11.1. Actualización de aplicaciones que utilizan EJB 2.x Copiar enlaceEnlace copiado en el portapapeles!
- Iniciar el servidor con el perfil completo
- Los beans CMP (del inglés Container Managed Persistence) EJB 2.x requieren el perfil completo de la edición empresarial de Java 6. Este perfil contiene elementos de configuración que se necesitan para ejecutar CMP EJBs.Este perfil de configuración contiene el módulo de extensión
org.jboss.as.cmp
:También contiene el subsistema<extensions> ... <extension module="org.jboss.as.cmp"/> ... </extensions>
<extensions> ... <extension module="org.jboss.as.cmp"/> ... </extensions>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cmp
:.<profiles> ... <subsystem xmlns="urn:jboss:domain:cmp:1.1"/> ... </profiles>
<profiles> ... <subsystem xmlns="urn:jboss:domain:cmp:1.1"/> ... </profiles>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para iniciar un servidor autónomo JBoss EAP 6 con el perfil completo pase el argumento-c standalone-full.xml
or-c standalone-full-ha.xml
en la línea de comandos cuando inicie el servidor. - La configuración de contenedor ya no se soporta
- En versiones anteriores de JBoss EAP era posible configurar un contenedor diferente para entidades CMP y otros beans y utilizarlo estableciendo referencias dentro del archivo descriptor de implementación de la aplicación
jboss.xml
. Por ejemplo, había diferentes configuraciones para SLSB para poner los beans en sesiones en general.En JBoss EAP 6.x, es posible utilizar beans de entidad EJB 2 con un contenedor estándar. Sin embargo, ya no se soportan las diferentes configuraciones del contenedor. El enfoque recomendado es migrar los beans de sesión con estado EJB2 (SFSB del inglés Stateful Session Beans), los beans de sesión sin estado (SLSB ddel inglés Stateless Session Beans), beans dirigidos por mensajes (MDB del inglés Message Driven Beans) a EJB 3 y para la persistencia administrada por el contenedor (CMP del inglés Container-Managed Persistence) y los beans de entidad de persistencia administrada por beans (BMP del inglés Bean-Managed Persistence) utilizar la API de persistencia Java (JPA del inglés Java Persistence API) de acuerdo con la especificación EJB 3.La configuración predeterminada del contenedor en JBoss EAP 6 contiene varios cambios para los beans EJB 2 CMP:- El bloqueo pesimista está activado por defecto. Esto puede generar puntos muertos.
- El código de detección de deadLock que se encontraba en la capa CMP en JBoss EAP 5.x ya no está en JBoss EAP 6.
En JBoss EAP 5.x, también era posible el personalizar el caché, el agrupamiento,commit-options
y la pila de interceptores. En JBoss EAP 6, esto ya no es posible. Hay solo una implementación, la cual es similar a la políticaInstance Per Transaction
concommit-option
C
. Si migra una aplicación que usa la configuración del contenedor del bean de entidadescmp2.x jdbc2 pm
, el cual usa un administrador de persistencia basado en JDBC compatible con CMP2.x , entonces tendrá impacto en el rendimiento. Este contenedor se optimizó para rendimiento. Se recomienda que migre estas entidades a EJB 3 antes de migrar la aplicación. - Configuración del interceptor del lado del servidor
- JBoss EAP 6 soporta el
Interceptor
Java EE estándar utilizando las anotaciones@Interceptors
y@AroundInvoke
. Sin embargo, esto no permite la manipulación por fuera de la transacción o la seguridad.En versiones anteriores de JBoss EAP era posible modificar la pila de interceptores para tener interceptores personalizados para cada invocación EJB. Esto se utilizaba con frecuencia para implementar seguridad personalizada o mecanismos de reintento antes de chequeos de seguridad o chequeos de transacciones o creación. JBoss EAP 6.1 introdujo interceptores de contenedor para brindar una funcionalidad similar. Para mayor información sobre interceptores de contenedor consulte el capítulo titulado Interceptores de contenedor en la Guía de desarrollo para JBoss EAP.Otro enfoque para brindar más control antes, durante o después de la fase de guardado de una transacción siguiendo la especificación Java EE es utilizar el registro de sincronización de transacciones para agregar un escucha.El recurso se puede recuperar usando uno de los siguientes métodos:La rutina callback debe implementar la interfaz- Use el
InitialContext
TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry) new InitialContext().lookup("java:jboss/TransactionSynchronizationRegistry"); tsr.registerInterposedSynchronization(new MyTxCallback());
TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry) new InitialContext().lookup("java:jboss/TransactionSynchronizationRegistry"); tsr.registerInterposedSynchronization(new MyTxCallback());
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Use inyección
@Resource(mappedName = "java:comp/TransactionSynchronizationRegistry") TransactionSynchronizationRegistry tsr; ... tsr.registerInterposedSynchronization(new MyTxCallback());
@Resource(mappedName = "java:comp/TransactionSynchronizationRegistry") TransactionSynchronizationRegistry tsr; ... tsr.registerInterposedSynchronization(new MyTxCallback());
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
javax.transaction.Synchronization
. Use el métodobeforeCompletion{}
para realizar cualquier chequeo antes de que la transacción se guarde o se deshaga. Si este método presenta unaRuntimeException
entonces la transacción se deshace y se le informa al cliente con unaEJBTransactionRolledbackException
. En el caso de una XA-Transaction, todos los recursos se desharán de acuerdo con el contrato XA. También es posible para la lógica empresarial habilitada el depender del estado de la transacción utilizando el métodoafterCompletion(int txStatus)
. Si este método presenta unaRuntimeException
entonces la transacción permanece en el estado anterior ya sea con lo cambios guardados o deshechos y no se le informa al cliente. Solo el administrador de transacciones muestra una advertencia dentro del los archivos de registro del servidor. - Configuración del lado del servidor para interceptores del lado del cliente
- En versiones anteriores de JBoss EAP era posible configurar los interceptores clientes dentro de la configuración del servidor y proporcionar solo las clases con el API cliente.En JBoss EAP 6, esto ya no es posible ya que el Proxy cliente ya no se crea en el lado del servidor ni se transmite al cliente después de la búsqueda. Ahora el proxy se genera del lado del cliente. Esta optimización evita una invocación del servidor para la búsqueda y carga de clases,
- Configuración del pool de beans de entidades
- En JBoss EAP 6 no se recomienda la configuración del pool de beans de entidades. Ya que se limita a la configuración del elemento
<strict-max-pool>
pueden tener lugar puntos muertos y otros problemas si el pool es demasiado pequeño para cargar todas las entidades en el grupo de resultados. Los beans de entidad no tienen métodos largos del ciclo de vida durante la inicialización así que el crear la y el contenedor que lo rodea no es más lento que cuando se utiliza una instancia de bean de entidad en pool. - Reemplace el archivo descriptor de implementación jboss.xml
- El descriptor de implementación
jboss-ejb3.xml
reemplaza el archivo descriptor de implementaciónjboss.xml
. Este archivo se utiliza para sobreescribir y agregar a las funcionalidades proporcionadas por el descriptor de implementaciónejb-jar.xml
de la edición empresarial Java (EE). El nuevo archivo es incompatible conjboss.xml
y eljboss.xml
ahora se ignora en las implementaciones.Por ejemplo, en lanzamientos anteriores de JBoss EAP, si definía una<resource-ref>
en el archivoejb-jar.xml
necesitaba una definición de recursos correspondiente para el nombre JNDI en el archivojboss.xml
. XDoclet automáticamente generaba ambos archivos descriptores de implementación. En JBoss EAP 6, la información de mapeo JNDI ahora se define en el archivojboss-ejb3.xml
. Asuma que la fuente de datos se define en el código fuente Java así:ElDataSource ds1 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource1"); DataSource ds2 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource2");
DataSource ds1 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource1"); DataSource ds2 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource2");
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ejb-jar.xml
define las siguientes referencias de recursos.Copy to Clipboard Copied! Toggle word wrap Toggle overflow El archivojboss-ejb3.jxml
mapea los nombres JNDI a las referencias usando la siguiente sintaxis XML.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Algunas de las opciones de configuración que estaban disponibles en el archivojboss.xml
JBoss EAP 5.x no se implementaron en JBoss EAP 6. La siguiente lista describe algunos de los atributos utilizados comúnmente en el archivojboss.xml
y si hay una manera opcional de alcanzarlos en JBoss EAP 6.- El elemento
method-attribute
se utilizaba para configurar métodos de beans de sesión y entidades individuales.- Las opciones de configuración
read-only
yidempotent
no se llevaron a JBoss EAP 6. - La opción
transaction-timeout
ahora se configura en el archivojboss-ejb3.xml
.
- El atributo
missing-method-permission-exclude-mode
cambió el comportamiento de los métodos sin implementar metadatos de seguridad explícitos en un bean asegurado. En JBoss EAP 6, la ausencia de una anotación@RolesAllowed
se trata de manera similar a@PermitAll
- Configuración de mapeo del tipo de fuente de datos
- En versiones anteriores de JBoss EAP, era posible configurar el mapeo del tipo de fuente de datos dentro del archivo de configuración de la implementación de la fuente de datos
*-ds.xml
.En JBoss EAP 6, esto se debe hacer ahora en el archivo descriptor de implementaciónjbosscmp-jdbc.xml
.<defaults> <datasource-mapping>mySQL</datasource-mapping> <create-table>true</create-table> .... </defaults>
<defaults> <datasource-mapping>mySQL</datasource-mapping> <create-table>true</create-table> .... </defaults>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En versiones anteriores de JBoss EAP, el mapeo personalizado se realizaba en el archivostandardjbosscmp-jdbc.xml
. Este archivo ya no está disponible y el mapeo ahora se realiza en el archivo descriptor de implementaciónjbosscmp-jdbc.xml
.
- Cambios en el iterador de relaciones administradas por el contenedor y colecciones
- En lanzamientos anteriores de JBoss EAP, era posible para algunos contenedores, por ejemplo el contenedor
cmp2.x jdbc2 pm
el iterar colecciones CMR (del inglés Container Managed Relationship) y borrar o agregar relaciones. Debido a que la configuración del contenedor no se soporta, esto ya no es posible en JBoss EAP 6. Para obtener mayor información sobre cómo lograr esta misma funcionalidad en el código de la aplicación, consulte EJB2.1 Localizador de entidades CMP con relaciones (CMR) retorna duplicados en EAP6 en la sección de Soluciones de la base de conocimiento de soporte del Portal de clientes. - Entradas duplicadas de relaciones administradas por el contenedor para localizadores
- En versiones anteriores de JBoss EAP, era posible seleccionar diferentes contenedores CMP que utilizaban diferentes estrategias de persistencia. El contenedor
cmp2.x jdbc2 pm
en JBoss EAP 5.x utilizabaSQL-92
optimizado para generar sintaxis LEFT OUTER JOIN optimizada para localizadores. Debido a que JBoss EAP 6.x solo soporta el contenedor estándar para CMP y CMR, la implementación no contiene estas optimizaciones. El localizador debe incluir la palabra claveDISTINCT
en la declaraciónSELECT
para evitar un producto cartesiano en el grupo de resultados. Para obtener mayor información consulte EJB2.1 Localizador para entidades CMP con relaciones (CMR) retorna duplicados en EAP6 en la sección de Soluciones de la base de conocimiento de soporte del Portal de clientes. - Cambio en el borrado predeterminado en cascada para beans de entidad CMP
- El valor predeterminado del borrado en cascada cambió a
false
. Esto puede generar fallos de borrado en JBoss EAP 6. Si relaciones de entidades se marcan comocascade-delete
debe establecer explícitamente elbatch-cascade-delete
comotrue
en el archivojbosscmp-jdbc.xml
. Para obtener mayor información consulte fallo en el borrado en cascada para entidades EJB2 CMP después de la migración a EAP6 en la sección de Soluciones de la base de conocimiento de soporte del Portal de clientes. - Mapeos personalizados CMP para campos personalizados
- Si utilizó las clases de mapeo de clientes tal como
JDBCParameterSetter
,JDBCResultSetReader
yMapper
en su aplicación JBoss EAP 5.x, es posible que vea lajava.lang.ClassNotFoundException
cuando implementa su aplicación en JBoss EAP 6. Esto se debe a que los nombres de paquetes para las interfaces se cambiaron deorg.jboss.ejb.plugins.cmp.jdbc.Mapper
aorg.jboss.as.cmp.jdbc.Mapper
. Para obtener mayor información consulte Cómo utilizar el mapeo de campos para las clases personalizadas en una aplicación EJB2 CMP en EAP6 en la sección de Soluciones de la base de conocimiento de soporte del Portal de clientes. - Generación de llaves primarias utilizando comandos de entidad
- Si su aplicación JBoss EAP 5 usa
entity-commands
para generar llaves primarias, por ejemploSequence
oAuto-increment
es posible que vea unaClassNotFoundException
para la claseJDBCOracleSequenceCreateCommand
cuando migra su aplicación a JBoss EAP 6. Esto se debe a que el paquete clase cambió deorg.jboss.ejb.plugins.cmp.jdbc
aorg.jboss.as.cmp.jdbc.keygen
. Si utiliza esta clase en su aplicación JBoss EAP 6 también debe agregar una dependencia en el móduloEAP_HOME/modules/system/layers/base/org/jboss/as/cmp
.
- Modifique el código para utilizar las nuevas reglas de espacio de nombres JNDI.
- Así como con EJB 3.0, tiene que utilizar el prefijo completo JNDI con EJB 2.x. Para mayor información sobre las nuevas reglas del espacio de nombre JNDI y ejemplos del código consulte Sección 3.1.8.1, “Actualización de los nombres de espacios de nombres JNDI de la aplicación”.Puede encontrar los ejemplos sobre cómo actualizar los espacios de nombres JNDI de lanzamientos anteriores aquí: Sección 3.1.8.5, “Ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6”.
- Modifique el descriptor de archivos
jboss-web.xml
- Modifique el
<jndi-name>
para cada<ejb-ref>
para utilizar el nuevo formato de búsqueda completamente calificado JNDI. - Use XDoclet para mapear el nombre JNDI Name de interfaces locales internas
- Con EJB 2 era muy común el utilizar el patrón
Locator
para buscar Beans. Si usted utilizaba este patrón en su aplicación, en lugar de modificar el código de la aplicación code, puede utilizar XDoclet para generar un mapa para los nuevos nombres JNDI.Una anotación XDoclet típica se ve así:El nombre JNDI@ejb.bean name="UserAttribute" display-name="UserAttribute" local-jndi-name="ejb21/UserAttributeEntity" view-type="local" type="CMP" cmp-version="2.x" primkey-field="id"
@ejb.bean name="UserAttribute" display-name="UserAttribute" local-jndi-name="ejb21/UserAttributeEntity" view-type="local" type="CMP" cmp-version="2.x" primkey-field="id"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ejb21/UserAttributeEntity
en el ejemplo anterior ya no es válido en JBoss EAP 6. Puede mapear este nombre a un nombre JNDI válido utilizando el subsistemanaming
en la configuración del servidor y un parche para XDoclet.Puede crear mapeos personalizados tal como se anota en el párrafo anterior titulado Mapeos personalizados CMP para campos personalizados o puede modificar el código tal como se describe en el siguiente procedimiento.Procedimiento 3.24. Cambie el código generado XDoclet y use el subsistema de nombrado
- Extraiga la plantilla XDoclet
lookup.xdt
que se encuentra enejb-module.jar
y modifiquelookup()
enlookupHome
así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Ejecute Ant, configurando el atributo plantilla para utilizar el
lookup.xdt
modificado para la tareaejbdoclet
. - Modifique el subsistema
naming
en el archivo de configuración del servidor para mapear el nombre JNDI viejo al nuevo nombre JNDI válido.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Los siguientes archivos ya no se soportan en JBoss EAP 6.
- jboss.xml
- El archivo descriptor de implementación
jboss.xml
ya no se soporta y se ignora si se incluye en el archivador implementado. - standardjbosscmp-jdbc.xml
- El archivo de configuración
standardjbosscmp-jdbc.xml
ya no se soporta. Esta información de configuración ahora se incluye en el móduloorg.jboss.as.cmp
y ya no se puede personalizar. - standardjboss.xml
- El archivo de configuración
standardjboss.xml
ya no se soporta. Esta información de configuración ahora se incluye en el archivostandalone.xml
al ejecutar un servidor autónomo o el archivodomain.xml
en un dominio administrado.
3.2.12. Cambios en JBoss AOP Copiar enlaceEnlace copiado en el portapapeles!
3.2.12.1. Actualización de aplicaciones que utilizan JBoss AOP Copiar enlaceEnlace copiado en el portapapeles!
- Las configuraciones EJB3 estándares que se realizaron anteriormente en el archivo
ejb3-interceptors-aop.xml
ahora se configuran en el archivo de configuración del servidor. Para un servidor autónomo, este es el archivostandalone/configuration/standalone-full.xml
. Si está ejecutando su servidor en un dominio administrado, este es el archivodomain/configuration/domain.xml
. - Los interceptores AOP del lado del servidor se deben modificar para utilizar el
Interceptor
Java EE estándar. Para obtener mayor información sobre interceptores contenedores y cómo utilizar un interceptor del lado del cliente en una aplicación, consulte el capítulo titulado Container Interceptors en la Development Guide para JBoss EAP 6 que se encuentra en el portal del cliente en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- Si no puede refactorizar el código entonces puede obtener una copia de las bibliotecas JBoss AOP y agruparlas con la aplicación. Las bibliotecas AOP pueden funcionar en JBoss EAP 6, pero no se implementan. Puede implementarlos manualmente usando el siguiente argumento de la línea de comandos cuando inicia el servidor:
-Djboss.aop.path=PATH_TO_AOP_CONFIG
Nota
Aunque las bibliotecas JBoss AOP pueden funcionar en JBoss EAP 6, no es una configuración soportada.
3.2.13. Migración de aplicaciones Seam 2.2 Copiar enlaceEnlace copiado en el portapapeles!
3.2.13.1. Migración de archivadores Seam 2.2 a JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
Cuando migra una aplicación Seam 2.2 necesita configurar la fuente de datos y especificar las dependencias de los módulos. También necesita determinar si la aplicación tiene alguna dependencia en archivadores que no se envían junto con JBoss EAP 6 y copie las JARs dependientes en el directorio lib/
de la aplicación.
Importante
Procedimiento 3.25. Migración de archivadores Seam 2.2
Actualización de la configuración de la fuente de datos
Algunos ejemplos de Seam 2.2 usan la fuente de datos JDBC predeterminada llamadajava:/ExampleDS
. Esta fuente de datos predeterminada cambió en JBoss EAP 6 ajava:jboss/datasources/ExampleDS
. Si su aplicación usa la base de datos del ejemplo puede hacer una de las siguientes cosas:Para mayor información sobre cómo configurar una fuente de datos consulte Sección 3.1.6.2, “Actualización de la configuración de la fuente de datos”.- Si quiere utilizar la base de datos del ejemplo que se envía junto con JBoss EAP 6, modifique el archivo
META-INF/persistence.xml
para reemplazar el elementojta-data-source
existente con el nombre JNDI de la fuente de datos de la base de datos:<!-- <jta-data-source>java:/ExampleDS</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- <jta-data-source>java:/ExampleDS</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Si prefiere mantener su base de datos existente, puede agregar la definición de la fuente de datos al archivo
EAP_HOME/standalone/configuration/standalone.xml
.Importante
Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.La siguiente definición es una copia de la fuente de datos HSQL predeterminada definida en JBoss EAP 6:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - También puede agregar la definición de la fuente de datos usando la interfaz de la línea de comandos del CLI de administración. El siguiente es un ejemplo de la sintaxis que tiene que utilizar para agregar una fuente de datos. La "\" al final de la línea indica la continuación del comando en la siguiente línea.
Ejemplo 3.3. Ejemplo de la sintaxis para agregar la definición de la fuente de datos
EAP_HOME/bin/jboss-cli --connect
$ EAP_HOME/bin/jboss-cli --connect [standalone@localhost:9999 /] data-source add --name=ExampleDS --jndi-name=java:/ExampleDS \ --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --driver-name=h2 \ --user-name=sa --password=sa
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Agregar las dependencias requeridas
Ya que las aplicaciones Seam 2.2 usan JSF 1.2, necesita agregar las dependencias para los módulos JSF 1.2 y excluir los módulos JSF 2.0. Para lograr esto necesita crear un archivojboss-deployment-structure.xml
en el directorioMETA-INF/
del EAR que contiene los siguientes datos:Si su aplicación usa marcos de trabajo de registro de terceros es necesario agregar esas dependencias tal como se describe aquí: Sección 3.1.4.1, “Modificar las dependencias de registros”.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si su aplicación usa Hibernate 3.x, primero trate de ejecutar la aplicación usando las bibliotecas Hibernate 4
Si su aplicación no usa el contexto de persistencia administrada Seam, la búsqueda Hibernate, validación u otras funcionalidades que han cambiado con Hibernate 4, es posible que pueda ejecutar con las bibliotecas Hibernate 4. Sin embargo, si veClassNotFoundExceptions
oClassCastExceptions
que apuntan a las clases Hibernate o ve errores similares al siguiente puede que necesite seguir las instrucciones en el siguiente paso y modificar la aplicación para utilizar bibliotecas Hibernate 3.3.Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copie los archivos dependientes de fuera de los marcos de trabajo u otros lugares
Si su aplicación usa Hibernate 3.x y no puede utilizar Hibernate 4 de manera exitosa con su aplicación, necesitará copiar las JARs Hibernate 3.x en el directorio/lib
y excluir el módulo Hibernate en la sección de implementaciones delMETA-INF/jboss-deployment-structure.xml
así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Tiene que tomar pasos adicionales cuando agrupa Hibernate 3.x con su aplicación. Para mayor información, consulte Sección 3.2.2.2, “Configuración de cambios para las aplicaciones que usan Hibernate y JPA”.Depurar y resolver errores JNDI Seam 2.2
Cuando migra una aplicación Seam 2.2 puede que vea erroresjavax.naming.NameNotFoundException
en el registro como el siguiente:Si no quiere modificar las búsquedas JNDI en el código, puede modificar el archivojavax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
Copy to Clipboard Copied! Toggle word wrap Toggle overflow components.xml
de la aplicación de esta manera:Reemplazar el elemento core-init existente
Primero necesita reemplazar el elemento core-init existente así:<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init debug="true" distributable="false"/>
<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init debug="true" distributable="false"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Busque los mensajes INFO de enlace JNDI en el registro del servidor
Luego, busque los mensajes INFO de enlace JNDI que se imprimen en el registro del servidor cuando se implementa la aplicación. Los mensajes de enlace JNDI se deben ver de manera similar a este:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Agregar elementos del componente
Para cada mensaje INFO de enlace JNDI en el registro, agregue un elementocomponent
que coincida en el archivocomponents.xml
:<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Para mayor información sobre cómo depurar y resolver problemas de migración consulte Sección 4.2.1, “Depurar y resolver problemas de migración”.Para ver una lista de problemas de migración conocidos con los archivadores Seam 2 consulte Sección 3.2.13.2, “Problemas de migración del archivador Seam 2.2 ”.
El archivador Seam 2.2 implementa y ejecuta de manera exitosa en JBoss EAP 6.
3.2.13.2. Problemas de migración del archivador Seam 2.2 Copiar enlaceEnlace copiado en el portapapeles!
- Seam 2.2 Drools y Java 7 no son compatibles
- Seam 2.2 Drools y Java 7 no son compatibles y fallan con un error que dice: org.drools.RuntimeDroolsException: value '1.7' is not a valid language level.
- Seam 2.2.5 firmado
cglib.jar
evita que el ejemplo Spring funcione - Cuando el ejemplo Spring se ejecuta usando la
cglib.jar
firmada que se envió junto con Seam 2.2.5 en JBoss EAP 5, falla debido a lo siguiente:java.lang.SecurityException: class "org.jboss.seam.example.spring.UserService$$EnhancerByCGLIB$$7d6c3d12"'s signer information does not match signer information of other classes in the same package
java.lang.SecurityException: class "org.jboss.seam.example.spring.UserService$$EnhancerByCGLIB$$7d6c3d12"'s signer information does not match signer information of other classes in the same package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow La solución para este problema es remover la firma de lacglib.jar
así:zip -d $SEAM_DIR/lib/cglib.jar META-INF/JBOSSCOD\*
- El ejemplo Seambay falla con la
NotLoggedInException
- La causa de este problema es que el encabezado del mensaje SOAP es nulo al procesar el mensaje en el SOAPRequestHandler y como consecuencia el id de la conversación no se configura.La solución opcional para este problema es sobreescribir
org.jboss.seam.webservice.SOAPRequestHandler.handleOutbound
tal como se describe en https://issues.jboss.org/browse/JBPAPP-8376. - El ejemplo Seambay falla con
UnsupportedOperationException
: no transaction - Este error es generado por cambios en el nombre JNDI del UserTransaction en JBoss EAP 6.La solución opcional para este problema es sobreescribir
org.jboss.seam.transaction.Transaction.getUserTransaction
, as described in https://issues.jboss.org/browse/JBPAPP-8322. - El ejemplo de las tareas presenta una
org.jboss.resteasy.spi.UnhandledException
: Unable to unmarshall request body - Este error es causado por la incompatibilidad entre seam-resteasy-2.2.5 incluído en JBoss EAP 5.1.2) y RESTEasy 2.3.1.GA incluído en JBoss EAP 6.La solución para este problema es usar el
jboss-deployment-structure.xml
para excluir resteasy-jaxrs, resteasy-jettison-provider, y resteasy-jaxb-provider de la implementación principal y resteasy-jaxrs, resteasy-jettison-provider, resteasy-jaxb-provider y resteasy-yaml-provider deljboss-seam-tasks.war
tal como se describe en https://issues.jboss.org/browse/JBPAPP-8315. Luego es necesario incluir las bibliotecas RESTEasy agrupadas con Seam 2.2 en el EAR. - Punto muerto entre
org.jboss.seam.core.SynchronizationInterceptor
y el bloqueo EJB de la instancia del componente con estado durante una petición AJAX - Se presenta una página de error con el mensaje "Caused by javax.servlet.ServletException with message: "javax.el.ELException: /main.xhtml @36,71 value="#{hotelSearch.pageSize}": org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: hotelSearch" o uno similar.El problema es que Seam 2 realiza su propio bloqueo por fuera del bean de sesión con estado (SFSB) y con un ámbito diferente. Esto significa que si un hilo accede un EJB dos veces en la misma transacción, después de la primera invocación tendrá el bloqueo SFSB pero no el bloqueo seam. Luego un segundo hilo podrá adquirir el bloqueo seam, el cual encontrará el bloqueo EJB y esperará. Cuando el primer hilo trata su segunda invocación se bloqueará en el interceptor 2 seam y será un punto muerto. En Java EE 5, las EJBs presentarían una excepción inmediatamente durante un acceso simultáneo. Este comportamiento cambió en Java EE 6.La solución para este problema es agregar @AccessTimeout(0) al EJB. Esto hará que se presente una
ConcurrentAccessException
cuando esta situación tenga lugar. - El ejemplo de la orden de creación del Dvdstore falla con una
javax.ejb.EJBTransactionRolledbackException
- El ejemplo dvdstore presenta el siguiente error:
JBAS011437: Found extended persistence context in SFSB invocation call stack but that cannot be used because the transaction already has a transactional context associated with it. This can be avoided by changing application code, either eliminate the extended persistence context or the transactional context. See JPA spec 2.0 section 7.6.3.1.
JBAS011437: Found extended persistence context in SFSB invocation call stack but that cannot be used because the transaction already has a transactional context associated with it. This can be avoided by changing application code, either eliminate the extended persistence context or the transactional context. See JPA spec 2.0 section 7.6.3.1.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Este problema se debe a los cambios en la especificación JPA.La solución para este problema es cambiar el contexto de persistencia atransactional
en las clasesCheckoutAction
yShowOrdersAction
y usar la operación de agrupamiento del administrador de entidades en los métodoscancelOrder
ydetailOrder
. - El proveedor JBoss Cache Seam Cache no se puede utilizar en JBoss EAP 6
- JBoss Cache no se soporta en JBoss EAP 6. Esto hace que el proveedor JBoss Cache Seam Cache falle en una aplicación Seam en el servidor de aplicaciones con una.
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolver
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolver
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Problema del auto escaneo de Hibernate 3.3.x para las entidades JPA con JBoss EAP 6
- La solución para este problema es listar todas las clases de entidades en el archivo persistence.xml manualmente. Por ejemplo:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - El llamar a componentes EJB Seam desde hilos que no son EJB genera una javax.naming.NameNotFoundException
- Este problema se ha generado debido a los cambios en JBoss EAP 6 para implementar el nuevo sistema de carga de clases modulares y para adoptar las nuevas convenciones de espacios de nombre JNDI estandarizadas. El espacio de nombre
java:app
está indicado para los nombres compartidos por todos los componentes en una sola aplicación. Los hilos que no son EE, tal como los hilos asincrónicos Quartz tienen que utilizar el espacio de nombrejava:global
, el cual es compartido por todas las aplicaciones implementadas en una instancia del servidor de aplicaciones.Si recibe unajavax.naming.NameNotFoundException
cuando trata de llamar a los componentes EJB Seam desde métodos asincrónicos Quartz tiene que modificar el archivocomponents.xml
para utilizar el nombre JNDI global, por ejemplo:<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>
<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para mayor información sobre los cambios JNDI consulte el siguiente tema: Sección 3.1.8.1, “Actualización de los nombres de espacios de nombres JNDI de la aplicación” . Para mayor información sobre este tema específico consulte BZ#948215 - Seam2.3 javax.naming.NameNotFoundException trying to call EJB Seam components from quartz asynchronous methods en las 2.2.0 Release Notes para Red Hat JBoss Web Framework Kit en el portal de clientes.
3.2.14. Migración de aplicaciones Spring Copiar enlaceEnlace copiado en el portapapeles!
3.2.14.1. Migración de aplicaciones Spring Copiar enlaceEnlace copiado en el portapapeles!
3.2.15. Otros cambios que afectan la migración Copiar enlaceEnlace copiado en el portapapeles!
3.2.15.1. Familiarícese con otros cambios que puedan afectar su migración Copiar enlaceEnlace copiado en el portapapeles!
3.2.15.2. Cambio del nombre del pug-in de Maven Copiar enlaceEnlace copiado en el portapapeles!
jboss-maven-plugin
no se ha actualizado y no funciona en JBoss EAP 6. Ahora tiene que utilizar org.jboss.as.plugins:jboss-as-maven-plugin
para implementar en el directorio correcto.
3.2.15.3. Modificación de aplicaciones clientes Copiar enlaceEnlace copiado en el portapapeles!
jboss-client.jar
y se encuentra en el directorio EAP_HOME/bin/client/
. Reemplaza la EAP_HOME/client/jbossall-client.jar
y contiene todas las dependencias requeridas para conectarse a JBoss EAP 6 desde un cliente remoto.
Capítulo 4. Herramientas y consejos Copiar enlaceEnlace copiado en el portapapeles!
4.1. Recursos de ayuda con la migración Copiar enlaceEnlace copiado en el portapapeles!
4.1.1. Recursos para ayudarle en su migración Copiar enlaceEnlace copiado en el portapapeles!
- Herramientas
- Hay varias herramientas que ayudan a automatizar algunos de los cambios de la configuración. Para mayor información, consulte: Sección 4.1.2, “Familiarización con las herramientas que le ayudan con la migración”.
- Consejos para la depuración
- Para ver una lista de las causas más comunes y la resolución de problemas y errores que puede encontrar cuando migra su aplicación, consulte: Sección 4.2.1, “Depurar y resolver problemas de migración”.
- Migraciones de ejemplo
- Para ver ejemplos de aplicaciones que se han migrado a JBoss EAP 6, consulte: Sección 4.3.1, “Revise la migración de las aplicaciones de ejemplo”.
4.1.2. Familiarización con las herramientas que le ayudan con la migración Copiar enlaceEnlace copiado en el portapapeles!
Hay algunas herramientas que le pueden ayudar en realizar su migración. La siguiente es una lista de estas herramientas junto con una descripción de lo que hacen.
- Tattletale
- Con el cambio a la carga de clases de manera modular, necesita encontrar y rectificar las dependencias de aplicaciones. Tattletale le puede ayudar a identificar nombres de módulos dependientes y generar el XML de configuración para su aplicación.
- Herramienta de migración IronJacamar
- En JBoss EAP 6, las fuentes de datos y los adaptadores de recursos ya no se configuran en un archivo separado. Ahora se definen en el archivo de configuración del servidor y usan nuevos esquemas. La herramienta de migración IronJacamar puede ayudar a convertir la configuración antigua al formato que JBoss EAP 6 espera.
4.1.3. Uso de Tattletale para encontrar dependencias de aplicaciones Copiar enlaceEnlace copiado en el portapapeles!
Debido a los cambios en la carga modular de clases en JBoss EAP 6, puede que encuentre rastros ClassNotFoundException
o ClassCastException
en el registro de JBoss cuando migre su aplicación. Para resolver estos errores, necesita encontrar las JARs que contienen las clases especificadas por las excepciones.
jboss-deployment-structure.xml
de su aplicación.
Procedimiento 4.1. Instale y ejecute Tattletale para buscar dependencias de aplicaciones
Nota
4.1.4. Descarga e instalación de Tattletale Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento 4.2. Descarga e instalación de Tattletale
- Descargue Tattletale versión 1.2.0.Beta2 o posteriores de http://sourceforge.net/projects/jboss/files/JBoss%20Tattletale.
- Descomprima el archivo en el directorio que escoja.
- Modifique el archivo
TATTLETALE_HOME/jboss-tattletale.properties
haciendo lo siguiente:- Agregue
ee6
yas7
a la propiedadprofiles
.profiles=java5, java6, ee6, as7
profiles=java5, java6, ee6, as7
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Borre el comentario de las propiedades
scan
yreports
.
4.1.5. Creación y revisión del reporte Tattletale Copiar enlaceEnlace copiado en el portapapeles!
- Cree el reporte Tattletale emitiendo el comando:
java -jar
TATTLETALE_HOME/tattletale.jar
APPLICATION_ARCHIVE
OUTPUT_DIRECTORY
Por ejemplo:java -jar tattletale-1.2.0.Beta2/tattletale.jar ~/applications/jboss-seam-booking.ear ~/output-results/
- En un navegador, abra el archivo
OUTPUT_DIRECTORY/index.html
y haga clic en "JBoss AS 7" bajo la sección "Reports".- La columna a la izquierda lista los archivos que la aplicación utiliza. Haga clic en el enlace ARCHIVE_NAME para ver los detalles sobre el archivo tal como la ubicación, la información del manifesto y las clases que contiene.
- El enlace
jboss-deployment-structure.xml
en la columna a la derecha muestra la manera de especificar la dependencia de módulos para el archivo nombrado en la columna izquierda. Haga clic en este enlace para ver la manera de definir la información del módulo de dependencias de implementación para este archivo.
4.1.6. Uso de la herramienta IronJacamar para migrar configuraciones del adapatador de recursos y la fuente de datos Copiar enlaceEnlace copiado en el portapapeles!
En versiones anteriores del servidor de aplicaciones, las fuentes de datos y los adaptadores de recursos se configuraban y se implementaban usando un archivo con el sufijo *-ds.xml
. La distribución IronJacamar 1.1 contiene una herramienta de migración que se puede utilizar para convertir estos archivos de configuración en el formato que la JBoss EAP 6 espera. La herramienta analiza sintácticamente el archivo de configuración fuente del lanzamiento anterior y luego crea y escribe la configuración XML en un archivo de salida en el nuevo formato. Este XML luego se puede copiar y pegar bajo el subsistema correcto en el archivo de configuración del servidor de JBoss EAP 6. Esta herrmienta hace el mejor esfuerzo para convertir atributos y elementos antiguos al formato nuevo, sin embargo, puede que sea necesario el realizar modificaciones adicionales al archivo generado.
Procedimiento 4.3. Instalación y ejecución de la herramienta de migración IronJacamar
Nota
4.1.7. Descarga e instalación de la herramienta de migración IronJacamar Copiar enlaceEnlace copiado en el portapapeles!
Nota
- Descargue la última distribución de IronJacamar de aquí: http://www.ironjacamar.org/download.html
- Descomprima el archivo descargado en el directorio que escoja.
- Busque el script convertidor en la distribución IronJacamar.
- El script Linux se encuentra aquí:
IRONJACAMAR_HOME/doc/as/converter.sh
- El archivo de agrupación Windows se encuentra aquí:
IRONJACAMAR_HOME/doc/as/converter.bat
4.1.8. Use la herramienta de migración IronJacamar para convertir un archivo de configuración de la fuente de datos Copiar enlaceEnlace copiado en el portapapeles!
Nota
Procedimiento 4.4. Convertir un archivo de configuración de la fuente de datos
- Abra una línea de comandos y navegue al directorio
IRONJACAMAR_HOME/doc/as/
. - Ejecute el script convertidor con el siguiente comando:
- Para Linux:
./converter.sh -ds
SOURCE_FILE
TARGET_FILE
- Para Microsoft Windows:
./converter.bat -ds
SOURCE_FILE
TARGET_FILE
ElSOURCE_FILE
es el atchivo -ds.xml de la fuente de datos del lanzamiento anterior. ElTARGET_FILE
contiene la nueva configuración.Por ejemplo, para convertir el archivo de configuración de la fuente de datosjboss-seam-booking-ds.xml
en el directorio actual escribiría:- Para Linux:
./converter.sh -ds
jboss-seam-booking-ds.xml
new-datasource-config.xml
- Para Microsoft Windows:
./converter.bat -ds
jboss-seam-booking-ds.xml
new-datasource-config.xml
Note que el parámetro para la conversión de la fuente de datos es-ds
. - Copie el elemento
<datasource>
del archivo de destino y péguelo en el archivo de configuración del servidor bajo el elemento<subsystem xmlns="urn:jboss:domain:datasources:1.1">
<datasources>
.Importante
Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.- Si está ejecutando en un dominio administrado, copie el XML en el archivo
EAP_HOME/domain/configuration/domain.xml
. - Si está ejecutando como un servidor autónomo, copie el XML en el archivo
EAP_HOME/standalone/configuration/standalone.xml
.
- Modifique el XML generado en el nuevo archivo de configuración.Este es un ejemplo del archivo de configuración de la fuente de datos
jboss-seam-booking-ds.xml
para el ejemplo de reservas de Seam 2.2 que se envía junto con JBoss EAP 5.x:El siguiente es el archivo de configuración que se generó ejecutando el script convertidor. El archivo generado contiene u elementoCopy to Clipboard Copied! Toggle word wrap Toggle overflow <driver-class>
. La manera preferida de definir la clase controladora en JBoss EAP 6 es utilizar un elemento<driver>
. Este es el XML que resulta en el archivo de configuración de JBoss EAP 6 con modificaciones para borrar el comentario del elemento<driver-class>
y agregar el elemento correspondiente<driver>
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.9. Uso de la herramienta de migración IronJacamar para convertir un archivo de configuración del adaptador de recursos Copiar enlaceEnlace copiado en el portapapeles!
Nota
- Abra una línea de comandos y navegue al directorio
IRONJACAMAR_HOME/docs/as/
. - Ejecute el script convertidor con el siguiente comando:
- Para Linux:
./converter.sh -ra
SOURCE_FILE
TARGET_FILE
- Para Microsoft Windows:
./converter.bat -ra
SOURCE_FILE
TARGET_FILE
ElSOURCE_FILE
es el archivo -ds.xml del adaptador de recursos del lanzamiento anterior. ElTARGET_FILE
contiene la nueva configuración.Por ejemplo, para convertir el archivo de configuración del adaptador de recursosmttestadapter-ds.xml
en el directorio actual escribiría:- Para Linux:
./converter.sh -ra
mttestadapter-ds.xml
new-adapter-config.xml
- Para Microsoft Windows:
./converter.bat -ra
mttestadapter-ds.xml
new-adapter-config.xml
Note que el parámetro para la conversión del adaptador de recursos es-ra
. - Copie el elemento
<resource-adapters>
del archivo de destino y péguelo en el archivo de configuración del servidor bajo el elemento<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
.Importante
Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.- Si está ejecutando en un dominio administrado, copie el XML en el archivo
EAP_HOME/domain/configuration/domain.xml
. - Si está ejecutando como un servidor autónomo, copie el XML en el archivo
EAP_HOME/standalone/configuration/standalone.xml
.
- Modifique el XML generado en el nuevo archivo de configuración.Este es un ejemplo del archivo de configuración del adaptador de recursos
mttestadapter-ds.xml
de JBoss EAP 5.x TestSuite:El siguiente es el archivo de configuración que se generó ejecutando el script convertidor. Reemplace el valor del atributo nombre-clase "FIXME_MCF_CLASS_NAME" en el XML generado con el nombre de clase correcto de la fábrica de conexiones administrada, en este caso, "org.jboss.test.jca.adapter.TestManagedConnectionFactory". Este es el XML que resulta en el archivo de configuración de JBoss EAP 6 con modificaciones para el valor del elementoCopy to Clipboard Copied! Toggle word wrap Toggle overflow <class-name>
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2. Problemas de migración de depuración Copiar enlaceEnlace copiado en el portapapeles!
4.2.1. Depurar y resolver problemas de migración Copiar enlaceEnlace copiado en el portapapeles!
4.2.2. Depurar y resolver ClassNotFoundExceptions y NoClassDefFoundErrors Copiar enlaceEnlace copiado en el portapapeles!
ClassNotFoundExceptions usualmente ocurren debido a una dependencia no resuelta. Esto significa que tiene que definir explícitamente las dependencias en otros módulos o copiar JARs de fuentes externas.
- Primero trate de encontrar la dependencia que falta. Esto se describe en más detalle aquí: Sección 4.2.3, “Búsqueda de la dependencia del módulo JBoss”
- Si no hay un módulo para la clase que falta entonces busque la JAR en la instalación anterior. Para obtener mayor información consulte Sección 4.2.4, “Buscar la JAR en la instalación anterior”
4.2.3. Búsqueda de la dependencia del módulo JBoss Copiar enlaceEnlace copiado en el portapapeles!
ClassNotFoundException
mirando en el directorio EAP_HOME/modules/system/layers/base/
. Si encuentra un módulo para la clase tiene que agregar una dependencia a la entrada del manifiesto.
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.TopicIndex.war:main" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:188)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log
from [Module "deployment.TopicIndex.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:188)
Procedimiento 4.5. Búsqueda de la dependencia
- Primero determine si hay un módulo obvio para la clase.
- Navegue al directorio
EAP_HOME/modules/system/layers/base/
y busque la clase que coincida con la ruta del módulo en laClassNotFoundException
.Encuentre la ruta del móduloorg/apache/commons/logging/
. - Abra el archivo
EAP_HOME/modules/system/layers/base/org/apache/commons/logging/main/module.xml
y busque el nombre del módulo. En este caso es "org.apache.commons.logging". - Agregue el nombre del módulo a las dependencias en el archivo
MANIFEST.MF
:Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Si no hay una ruta de módulo obvia para la clase, es posible que tenga que buscar la dependencia en otro lugar.
- Busque la clase nombrada por la
ClassNotFoundException
en el reporte Tattletale. - Busque el módulo que contiene la JAR en el directorio
EAP_HOME/modules
y busque el nombre del módulo tal como en el paso anterior.
4.2.4. Buscar la JAR en la instalación anterior Copiar enlaceEnlace copiado en el portapapeles!
lib/
de su servidor anterior.
ClassNotFoundException
en el registro:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)
- Abra una terminal y navegue al directorio
EAP5_HOME/
. - Emita el comando:
grep 'org.hibernate.validator.ClassValidator' `find . \-name '*.jar'`
- Puede que vea más de un resultado. En este caso, el siguiente resultado es la JAR que necesitamos:
Binary file ./jboss-eap-5.1/seam/lib/hibernate-validator.jar matches
Binary file ./jboss-eap-5.1/seam/lib/hibernate-validator.jar matches
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Copie esta JAR al directorio
lib/
de la aplicación.Si encuentra que necesita un número más grande de JARs, puede que sea más fácil el definir un módulo para las clases. Para mayor información consulte Modules en el capítulo titulado Inicio rápido para desarrollar aplicaciones en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. - Vuelva a construir y a implementar la aplicación
4.2.5. Depurar y resolver ClassCastExceptions Copiar enlaceEnlace copiado en el portapapeles!
- Busque la aplicación para encontrar todas las JAR(s) que contienen la clase nombrada por la
ClassCastException
. Si hay un módulo definido para la clase, encuentre y borre las JAR(s) duplicadas del WAR o EAR de la aplicación. - Busque el módulo JBoss que contiene la clase y defina explícitamente la dependencia en el archivo
MANIFEST.MF
o en el archivojboss-deployment-structure.xml
. Para mayor información consulte Class Loading and Subdeployments en el capítulo titulado Class Loading and Modules en la Development Guide para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. - Si no puede resolverlo usando los pasos anteriores, con frecuencia puede determinar la causa del problema imprimiendo la información del cargador de clases en el registro. Por ejemplo, puede ver la siguiente
ClassCastException
en el registro:java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - En su código imprima la información del cargador de clases para las clases nombradas por la
ClassCastException
para el registro, por ejemplo:logger.info("Class loader for CustomClass1: " + com.example1.CustomClass1.getClass().getClassLoader().toString()); logger.info("Class loader for CustomClass2: " + com.example2.CustomClass2.getClass().getClassLoader().toString());
logger.info("Class loader for CustomClass1: " + com.example1.CustomClass1.getClass().getClassLoader().toString()); logger.info("Class loader for CustomClass2: " + com.example2.CustomClass2.getClass().getClassLoader().toString());
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - La información en el registro muestra qué módulos están cargando las clases y con base en su aplicación necesitará borrar o mover las JAR(s) que causan conflictos.
4.2.6. Depurar y resolver DuplicateServiceExceptions Copiar enlaceEnlace copiado en el portapapeles!
- Renombre el archivo JAR con un nombre diferente del de la WAR así que los contextos web y WAR son únicos.
- Proporcione un elemento
<context-root>
en el archivojboss-web.xml
. - Proporcione un elemento
<context-root>
en el archivojboss-webservices.xml
. - Personalice el elemento
<context-root>
para la WAR en el archivoapplication.xml
.
4.2.7. Depurar y resolver errores de la página de depuración de JBoss Seam Copiar enlaceEnlace copiado en el portapapeles!
Figura 4.1. Página de depuración JBoss Seam
- Amplie la sección
Component
en la página y busque el componenteorg.jboss.seam.caughtException
. - La causa y el rastro de la pila debe apuntarle a las dependencias que faltan.
Figura 4.2. Información del componente
org.jboss.seam.caughtException
- Use la técnica descrita en Sección 4.2.2, “Depurar y resolver ClassNotFoundExceptions y NoClassDefFoundErrors” para resolver dependencias de módulos.En el ejemplo anterior la solución más simple es agregar
org.slf4j
alMANIFEST.MF
Manifest-Version: 1.0 Dependencies: org.slf4j
Manifest-Version: 1.0 Dependencies: org.slf4j
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Otra opción es agregar una dependencia para el módulo al archivojboss-deployment-structure.xml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. Revise la migración de las aplicaciones de ejemplo Copiar enlaceEnlace copiado en el portapapeles!
4.3.1. Revise la migración de las aplicaciones de ejemplo Copiar enlaceEnlace copiado en el portapapeles!
La siguiente es una lista de las aplicaciones de ejemplo de JBoss EAP 5.x que se han migrado a JBoss EAP 6. Para ver los detalles de lo que se cambió en una aplicación en particular haga clic en el enlace a continuación.
4.3.2. Migración del ejemplo Seam 2.2 JPA a JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
La siguiente lista de tareas resume los cambios necesarios para migrar exitosamente la aplicación de ejemplo de Seam 2.2 JPA a JBoss EAP 6. Esta aplicación de ejemplo se puede encontrar en la última distribución de JBoss EAP 5 bajo EAP5.x_HOME/jboss-eap-5.x/seam/examples/jpa/
Importante
Procedimiento 4.6. Migración del ejemplo Seam 2.2 JPA
Borre el archivo jboss-web.xml
Borre el archivojboss-web.xml
del directoriojboss-seam-jpa.war/WEB-INF/
. La carga de clases definida en eljboss-web.xml
ahora es el comportamiento predeterminado.Modifique el archivo
jboss-seam-jpa.jar/META-INF/persistence.xml
así:- Remueva o borre el comentario de la propiedad
hibernate.cache.provider_class
en el archivojboss-seam-jpa.war/WEB-INF/classes/META-INF/persistence.xml
:<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Agregue la propiedad del módulo proveedor al archivo
jboss-seam-booking.jar/META-INF/persistence.xml
:<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Cambie la propiedad
jta-data-source
para utilizar el nombre JNDI de la fuente de datos JDBC predeterminada:<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Agregar dependencias Seam 2.2
Copie las siguientes JARs de la biblioteca de la distribución Seam 2.2,SEAM_HOME/lib/
, en el directoriojboss-seam-jpa.war/WEB-INF/lib/
:- antlr.jar
- slf4j-api.jar
- slf4j-log4j12.jar
- hibernate-entitymanager.jar
- hibernate-core.jar
- hibernate-annotations.jar
- hibernate-commons-annotations.jar
- hibernate-validator.jar
Cree un archivo jboss-deployment-structure para agregar las dependencias que faltan
Cree un archivojboss-deployment-structure.xml
en la carpetajboss-seam-jpa.war/WEB-INF/
que contenga los siguientes datos:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
La aplicación de ejemplo Seam 2.2 JPA implementa y ejecuta de manera exitosa en JBoss EAP 6.
4.3.3. Migración del ejemplo de reservas Seam 2.2 a JBoss EAP 6 Copiar enlaceEnlace copiado en el portapapeles!
La migración EAR de reservas Seam 2.2 es más complicada que el ejemplo de Seam 2.2 JPA WAR. La documentación para la migración del ejemplo Seam 2.2 JPA WAR se puede encontrar aquí: Sección 4.3.2, “Migración del ejemplo Seam 2.2 JPA a JBoss EAP 6”. Para migrar la aplicación tiene que hacer la siguiente:
- Inicializar JSF 1.2 en lugar del JSF 2 predeterminado.
- Agrupe versiones antiguas de las JARs Hibernate en lugar de utilizar las que se envían junto con JBoss EAP 6.
- Cambie los enlaces JNDI para utilizar la nueva sintaxis portátil JNDI Java EE 6.
Importante
Procedimiento 4.7. Migración del ejemplo de reservas Seam 2.2
Cree el archivo
jboss-deployment-structure.xml
Cree un nuevo archivo llamadojboss-deployment-structure.xml
en eljboss-seam-booking.ear/META-INF/
y agregue el siguiente contenido:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Modifique el archivo
jboss-seam-booking.jar/META-INF/persistence.xml
así:- Omita o borre el comentario de la propiedad hibernate para la clase del proveedor cache:
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Agregue la propiedad del módulo proveedor al archivo
jboss-seam-booking.jar/META-INF/persistence.xml
:<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Cambie la propiedad
jta-data-source
para utilizar el nombre JNDI de la fuente de datos JDBC predeterminada:<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Copie las JARs de la distribución Seam 2.2
Copie las siguientes JARs de la distribución Seam 2.2EAP5.x_HOME/jboss-eap5.x/seam/lib/
en el directoriojboss-seam-booking.ear/lib
.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cambie los nombres de búsqueda JNDI
Cambie las cadenas de búsqueda JNDI en el archivojboss-seam-booking.war/WEB-INF/components.xml
. Debido a las nuevas reglas portátiles JNDI, JBoss EAP 6 ahora enlaza EJBs usando reglas de sintaxis portátiles JNDI y no puede utilizar el jndiPattern que se utilizó en JBoss EAP 5. Así se deben cambiar las cadenas de búsqueda JNDI EJB de la aplicación para JBoss EAP 6:Las cadenas de búsqueda JNDI para las EJBs del marco de trabajo Seam 2.2 se debn cambiar así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Puede tomar cualquiera de los siguientes enfoques:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Agregar elementos del componente
Puede agregar unjndi-name
para todo EJB alWEB-INF/components.xml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Puede modificar el código agregando la anotación
@JNDIName(value="")
especificando la ruta JNDI. A continuación puede ver un ejemplo del código cambiado del bean de sesión sin estado. Puede encontrar una descripción detallada de este proceso en la documentación de referencia de Seam 2.2.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
La aplicación de reservas Seam 2.2 implementa y ejecuta de manera exitosa en JBoss EAP 6.
4.3.4. Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso Copiar enlaceEnlace copiado en el portapapeles!
EAP6_HOME/standalone/deployments
sin ningun cambio aparte de extraer los archivadores. Esto le permite modificar fácilmente los archivos XML que se encuentran dentro de los archivadores cuando encuentre y resuelva el problema.
Importante
Procedimiento 4.8. Migración de la aplicación
4.3.5. Construcción e implementación de JBoss EAP versión 5.X de la aplicación de reservas Seam 2.2 Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento 4.9. Construir e implementar el EAR
- Construir el EAR:
cd /EAP5_HOME/jboss-eap5.x/seam/examples/booking ANT_HOME/ant explode
$ cd /EAP5_HOME/jboss-eap5.x/seam/examples/booking $ ANT_HOME/ant explode
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reemplace jboss-eap5.x con la versión de JBoss EAP desde donde está migrando - Copie el EAR al directorio de implementaciones EAP6_HOME:
cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.ear EAP6_HOME/standalone/deployments/ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.war EAP6_HOME/standalone/deployments/jboss-seam.ear cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.jar EAP6_HOME/standalone/deployments/jboss-seam.ear
$ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.ear EAP6_HOME/standalone/deployments/ $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.war EAP6_HOME/standalone/deployments/jboss-seam.ear $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.jar EAP6_HOME/standalone/deployments/jboss-seam.ear
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Inicie el servidor de JBoss EAP 6 y revise el resgistro. Verá:
INFO [org.jboss.as.deployment] (DeploymentScanner-threads - 1) Found jboss-seam-booking.ear in deployment directory. To trigger deployment create a file called jboss-seam-booking.ear.dodeploy
INFO [org.jboss.as.deployment] (DeploymentScanner-threads - 1) Found jboss-seam-booking.ear in deployment directory. To trigger deployment create a file called jboss-seam-booking.ear.dodeploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Cree un archivo vacío con el nombre
jboss-seam-booking.ear.dodeploy
y cópielo en el directorioEAP6_HOME/standalone/deployments
. Necesita copiar este archivo en el directorio de implementaciones muchas veces al migrar esta aplicación así que manténgalo en un lugar en donde lo pueda encontrar fácilmente. En el registro ahora debe ver los siguientes mensajes, indicando que se está implementando:INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "jboss-seam-booking.ear" INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Starting deployment of "jboss-seam-booking.jar" INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of "jboss-seam.jar" INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) Starting deployment of "jboss-seam-booking.war"
INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "jboss-seam-booking.ear" INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Starting deployment of "jboss-seam-booking.jar" INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of "jboss-seam.jar" INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) Starting deployment of "jboss-seam-booking.war"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En este momento se encuentra con su primer error de implementación. En el siguiente paso, se revisa cada problema y aprende a depurar y a resolverlos.Para aprender cómo depurar y resolve problemas de implementación haga clic aquí: Sección 4.3.6, “Depuración y resolución de errores y excepciones de implementación del archivador de reservas Seam 2.2”Para regresar al tema anterior haga clic aquí: Sección 4.3.4, “Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso”
4.3.6. Depuración y resolución de errores y excepciones de implementación del archivador de reservas Seam 2.2 Copiar enlaceEnlace copiado en el portapapeles!
Importante
Procedimiento 4.10. Depuración y resolución de excepciones y errores de implementación
- Emita - java.lang.ClassNotFoundException: javax.faces.FacesExceptionCuando implementa la aplicación, el registro contiene el siguiente error:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase
javax.faces.FacesException
y necesita agregar la dependencia de manera explícita.Para resolverlo:Busque el nombre del módulo para esa clase en el directorio
EAP6_HOME/modules/system/layers/base/
buscando una ruta que coincida con la clase que falta. En este caso se encuentran dos módulos que coinciden:Ambos módulos tienen el mismo nombre de módulo:javax/faces/api/main javax/faces/api/1.2
javax/faces/api/main javax/faces/api/1.2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow javax.faces.api
pero uno en el directorio principal es para JSF 2.0 y el que se encuentra en el directorio 1.2 es para JSF 1.2. Si hubiera solo un módulo disponibles entonces podría simplemente crear un archivoMANIFEST.MF
y agregar la dependencia del módulo. Pero en este caso, quiere utilizar la versión JSF 1.2 y no la versión 2.0 en main así que necesita especificar uno y excluir el otro. Para lograr esto, cree un archivojboss-deployment-structure.xml
en el directorioMETA-INF/
del EAR que contiene los siguientes datos:En la secciónCopy to Clipboard Copied! Toggle word wrap Toggle overflow deployment
agregue la dependencia para lajavax.faces.api
para el módulo JSF 1.2. También agregue la dependencia para el módulo JSF 1.2 en la sección de subimplementación para la WAR y excluya el módulo para JSF 2.0.Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.apache.commons.logging.LogCuando implementa la aplicación, el registro contiene el siguiente error:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.apache.commons.logging.Log
y necesita agregar la dependencia de manera explícita.Para resolverlo:Busque el nombre del módulo para esa clase en el directorio
EAP6_HOME/modules/system/layers/base/
buscando una ruta que coincida con la clase que falta. En este caso, encuentra un módulo que coincide con la rutaorg/apache/commons/logging/
. El nombre del módulo es “org.apache.commons.logging”.Modifique el archivojboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo.El<module name="org.apache.commons.logging" export="true"/>
<module name="org.apache.commons.logging" export="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml
ahora se debe ver así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionCuando implementa la aplicación, el registro contiene el siguiente error:
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.dom4j.DocumentException
.Para resolverlo:Busque el nombre del módulo en el directorio
EAP6_HOME/modules/system/layers/base/
buscando laorg/dom4j/DocumentException
. El nombre del módulo es “org.dom4j”. Modifique el archivojboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo.El archivo<module name="org.dom4j" export="true"/>
<module name="org.dom4j" export="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml
ahora se debe ver así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueCuando implementa la aplicación, el registro contiene el siguiente error:
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.hibernate.validator.InvalidValue
.Para resolverlo:Hay un módulo “org.hibernate.validator”, pero la JAR no contiene la clase
org.hibernate.validator.InvalidValue
así que el agregar la dependencia del módulo no resuelve este problema. En este caso, la JAR que contiene la clase era parte de la implementación JBoss EAP 5.X. Busque la JAR que contiene la clase que falta en el directorioEAP5_HOME/seam/lib/
. Para lograr esto, abra una consola y escriba lo siguiente:El resultado muestra:cd EAP5_HOME/seam/lib grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
Copy to Clipboard Copied! Toggle word wrap Toggle overflow En este caso, copie laBinary file ./hibernate-validator.jar matches Binary file ./test/hibernate-all.jar matches
$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
Copy to Clipboard Copied! Toggle word wrap Toggle overflow hibernate-validator.jar
al directoriojboss-seam-booking.ear/lib/
:cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryCuando implementa la aplicación, el registro contiene el siguiente error:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La
com.sun.faces.config.ConfigurationException
y lajava.lang.InstantiationException
indican un problema de dependencias. En este caso, la causa no es tan obvia.Para resolverlo:Necesita encontrar el módulo que contiene las clases
com.sun.faces
. Aunque no hay un módulocom.sun.faces
, hay dos móduloscom.sun.jsf-impl
. Una revisión rápida de lajsf-impl-1.2_13.jar
en el directorio 1.2 muestra que contiene las clasescom.sun.faces
. Tal como lo hizo conjavax.faces.FacesException
ClassNotFoundException
, debe utilizar la versión JSF 1.2 y no la versión JSF 2.0 en main, así que necesita especificar una y excluir la otra. Necesita modificar eljboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo. También tiene que agregarla a la subimplementación WAR y excluir el módulo JSF 2.0. El archivo se debe ver así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackCuando implementa la aplicación, el registro contiene el siguiente error:
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader] (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader] (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.apache.commons.collections.ArrayStack
.Para resolverlo:Busque el nombre del módulo en el directorio
EAP6_HOME/modules/system/layers/base/
buscando la rutaorg/apache/commons/collections
. El nombre del módulo es “org.apache.commons.collections”. Modifique eljboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo.El archivo<module name="org.apache.commons.collections" export="true"/>
<module name="org.apache.commons.collections" export="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml
ahora se debe ver así:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - servicios con dependencias no disponibles/que faltanCuando implementa la aplicación, el registro contiene el siguiente error:
ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]"," (... additional logs removed ...) "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]"," (... additional logs removed ...) "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:Cuando obtenga un error “Services with missing/unavailable dependencies”, vea el texto dentro de los paréntesis después de “missing”. En este caso puede ver:
El “/em” indica un problema de fuente de datos y gestor de entidades.missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para resolverlo:En JBoss EAP 6, la configuración de la fuente de datos cambió y es necesario definirla en el archivo
EAP6_HOME/standalone/configuration/standalone.xml
. Ya que JBoss EAP 6 se envía junto con una base de datos de ejemplo que ya está definida en el archivostandalone.xml
, modifique el archivopersistence.xml
para utilizar esa base de datos de ejemplo en esta aplicación. Al ver en el archivostandalone.xml
puede ver que eljndi-name
para la base de datos de ejemplo esjava:jboss/datasources/ExampleDS
. Modifique el archivojboss-seam-booking.jar/META-INF/persistence.xml
para comentar el elemento existentejta-data-source
y reemplazarlo así:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - En este momento la aplicación se implementa sin errores, pero cuando accede la URL http://localhost:8080/seam-booking/ en un navegador e intenta "Account Login", obtiene un error en tiempo de ejecución “The page isn't redirecting properly”. En el siguiente paso, aprenderá a depurar y resolver errores en tiempo de ejecución.Para aprender cómo depurar y resolver problemas de tiempo de ejecución haga clic aquí: Sección 4.3.7, “Depuración y resolución de errores y excepciones en tiempo de ejecución del archivador de reservas Seam 2.2”Para regresar al tema anterior haga clic aquí: Sección 4.3.4, “Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso”
4.3.7. Depuración y resolución de errores y excepciones en tiempo de ejecución del archivador de reservas Seam 2.2 Copiar enlaceEnlace copiado en el portapapeles!
Importante
Procedimiento 4.11. Depuración y resolución de excepciones y errores en tiempo de ejecución
- Emita - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''Cuando accede la URL http://localhost:8080/seam-booking/ en un navegador, obtiene un mensaje que dice "La página no está redireccionando apropiadamente" y el registro contiene el siguiente error:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:Una
NameNotFoundException
indica un problema de nombrado JNDI. Las reglas de nombrado JNDI han cambiado en JBoss EAP 6 así que necesita modificar los nombres de búsqueda para seguir las nuevas reglas.Para resolverlo:Para depurar esto, busque en la parte anterior del rastro del registro del servidor para ver qué enlace JNDI se utilizó. Al mirar en el registro del servidor puede ver esto:
Hay un total de ocho enlaces INFO JNDI listados en el registro, uno para cada bean de sesión: RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations y TimerServiceDispatcher. Necesita modificar el archivoCopy to Clipboard Copied! Toggle word wrap Toggle overflow lib/components.xml
del WAR para usar los nuevos enlaces JNDI. En el registro, note que todos los enlaces EJB JNDI empienzan por "java:app/jboss-seam-booking.jar" Reemplace el elementocore:init
así:Luego, necesita agregar los enlaces JNDI EjbSynchronizations y TimerServiceDispatcher. Agregue los siguientes elementos de componente al archivo:<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El archivo components.xml ahora se debe ver así:<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a implementar la aplicación borrando el archivostandalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Problema - la aplicación se implementa y ejecuta sin errores. Cuando accede la URL http://localhost:8080/seam-booking/ en un navegador y trata de iniciar sesión, falla y presenta el mensaje "Inicio de sesión fallido. Transacción fallida". Debe ver un rastro de excepción en el registro del servidor:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La ClassNotFoundException indica que falta una biblioteca Hibernate. En este caso es la
hibernate-core.jar
.Para resolverlo:Copie la JAR
hibernate-core.jar
del directorioEAP5_HOME/seam/lib/
al directoriojboss-seam-booking.ear/lib
.Vuelva a implementar la aplicación borrando el archivostandalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Problema - la aplicación se implementa y ejecuta sin errores. Cuando accede la URL http://localhost:8080/seam-booking/ en un navegador, puede iniciar sesión de manera exitosa. Sin embargo, cuando trata de reservar un hotel verá un rastro de excepción.Para depurar esto, primero debe borrar la
jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar
ya que enmascara el error verdadero. En este momento debe ver el siguiente error:java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lo que significa:La NoClassDefFoundError indica que falta una biblioteca Hibernate.
Para resolverlo:Copie las JARs
hibernate-annotations.jar
yhibernate-commons-annotations.jar
del directorioEAP5_HOME/seam/lib/
al directoriojboss-seam-booking.ear/lib
.Vuelva a implementar la aplicación borrando el archivostandalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Se deben resolver los errores de tiempo de ejecución y de las aplicacionesEn este punto, la aplicación se implementa y ejecuta sin errores.Para regresar al tema anterior haga clic aquí: Sección 4.3.4, “Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso”
4.3.8. Revisión de un resumen de los cambios realizados al migrar la aplicación de reservas Seam 2.2 Copiar enlaceEnlace copiado en el portapapeles!
Importante
- Creó un archivo
jboss-deployment-structure.xml
en el directorioMETA-INF/
del EAR. Agregó<dependencies>
y<exclusions>
para resolverClassNotFoundExceptions
. Este archivo contiene los siguientes datos:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Copió las siguientes JARs del directorio
EAP5_HOME/jboss-eap-5.X/seam/lib/
(reemplace 5.X con la versión de EAP 5 desde la cual está migrando) al directoriojboss-seam-booking.ear/lib/
para resolverClassNotFoundExceptions
:- hibernate-core.jar
- hibernate-validator.jar
- Modificó el archivo
jboss-seam-booking.jar/META-INF/persistence.xml
así:- Cambió el elemento
jta-data-source
para usar la base de datos de ejemplo que se envía junto con JBoss EAP 6:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Borró el comentario de la propiedad hibernate.cache.provider_class:
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Modificó el archivo
lib/components.xml
del WAR para utilizar los nuevos enlaces JNDI- Reemplazó el elemento existente
core:init
así:<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Agregó los elementos de componentes para los enlaces JNDI "EjbSynchronizations" y "TimerServiceDispatcher"
<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Apéndice A. Historial de revisiones Copiar enlaceEnlace copiado en el portapapeles!
Historial de revisiones | |||
---|---|---|---|
Revisión 6.3.0-24 | Wednesday July 30 2014 | ||
|