There is a process already using the admin port 4848. Glassfish 4/CentOS 6.

El servidor de aplicaciones Glassfish 4.1 de un cliente no quería arrancar y mandaba el mensaje de error especificado en la siguiente imagen:

El servidor corre el sistema operativo CentOS 6 y al inspeccionar los puertos para ver que proceso estaba utilizando el puerto indicado en el mensaje, el 4848, indicaba que ningún proceso estaba ocupando dicho puerto. Así que quedó descartado que fuera otra instancia de Glassfish ejecutándose en la misma máquina.

El problema era que la máquina del cliente no tenía en su archivo /etc/hosts el hostname de su servidor. Para obtener el nombre del hostname.

Así que bastó con editar el archivo /etc/hosts y añadir al final de la IP 127.0.0.1 el hostname del servidor.

Con el comando hostname obtenemos el nombre del servidor. El archivo /etc/hosts debería más o menos quedar así:

Donde HOSTNAME es el nombre del servidor obtenido con el comando hostname.

¡Hasta la próxima!

 

 

Cómo añadir o restar horas, minutos o segundos a una fecha en java con la clase Calendar

A veces es necesario, en nuestros programas java, incrementar o restar de una fecha en cierta cantidad de horas, minutos o segundos. Usando la clase Calendar de este lenguaje es muy sencillo hacer este tipo de operaciones con el tiempo.

Aquí les dejo el código auto-explicativo:

Al ejecutar el código anterior dará la siguiente salida (dependiendo de la hora en que sea ejecutado):

Espero y les sea útil.

¡Hasta la próxima!

 

Dar formato a una fecha con String.format() de java usando un Calendar.

El siguiente código usa la clase Calendar para almacenar la fecha y hora actual y dar formato a dicha fecha usando el método format() de la clase String:

Ejecutando el código anterior mostrará como resultado la fecha con el siguiente formato:

¡Espero les sea útil! ¡Saludos!

Rellenar con espacios a la derecha un texto con java.

En ocasiones queremos generar un texto de un ancho fijo y rellenar con espacios los caracteres que no son utilizados o ocupados por la cadena de caracteres que contiene, por ejemplo, tenemos una cadena con el contenido “ABC” y queremos generar una cadena de 10 caracteres con el texto “ABC” cargado a la izquierda, y el resto de los caracteres a la derecha, rellenarlos con espacios.

Para eso podemos usar el método format de la clase String, de esta forma:

El código anterior arrojaría el siguiente resultado:

Los corchetes cuadrados se agregaron para apreciar los espacios en la cadena de texto.

Si quisiéramos usar este mismo método para rellenar con otro caracter, usaríamos el método replace de la clase String para reemplazar los espacios por el caracter deseado; así:

Lo que daría como resultado:

Si en lugar de usar el formato “%-10s” en el método format, usáramos “%10s” los espacios y/o asteriscos, aparecerían  a la izquierda del texto.

Les dejo de tarea este ejercicio.

Espero y les sea útil este tip. ¡Saludos!

 

 

Problema con JasperSoft Studio 6.3.0 y Ubuntu 16.04: SWTException: Failed to execute runnable

Recién actualice mi PC a Ubuntu Xenial (16.04) mi JasperSoft Studio 6.3.0 comenzó a tener fallos, no “pintaba” bien la interfaz gráfica y algunos textos desaparecían, así como de pronto se congelaba y el CPU mostraba alto consumo en el proceso java. También otro síntoma es que la conexiones no funcionaban y las consultas que utilizaban los reportes no se cargaban en la edición gráfica.

El archivo .log de JasperSoft Studio mostraba la excepción SWTException continuamente.

El problema se debe a que ésta nueva versión LTS de Ubuntu utiliza la versión 3 de GTK y la versión de Eclipse que utiliza el JasperSoft Studio no es compatible o tiene conflictos con esta versión.

La solución es editar el archivo .ini de JasperSoft Studio que se encuentra dentro de la carpeta donde se instaló este, y agregar las líneas que se muestran en negrita antes del parámetro -vm:

Otra solución es establecer la variable de ambiente SWT_GTK3 en el archivo runubuntu.sh que se encuentra dentro de la carpeta de instalación; de esta forma:

Si se opta por ésta última solución, es necesario arrancar el JasperSoft Studio ejecutando este archivo y no el archivo binario Jasper Studio.

¡Visita los patrocinadores para tener más tips de estos!

¡Gracias y saludos!

Activar acceso remoto a consola de administración de Payara (Glassfish) desde linea de comandos

En servidores Linux, por lo general no se tiene ambiente gráfico instalado, por lo que es necesario configurar Payara, clon de Glassfish, desde línea de comando.

Por defecto, después de instalar Payara, el acceso remoto a la consola de administración no es posible sin antes definir una contraseña para el usuario administrador y activar el puerto seguro (https).

Para llevar a cabo estas dos tareas, payara debe estar iniciado. Nos colocamos primero en el directorio bin que se encuentra dentro de la carpeta glassfish que se ubica dentro del directorio de instalación de Payara; por ejemplo, si se instaló payara en el directorio /opt, el comando a ejecutar sería:

# cd /opt/payara41/glassfish/bin

Una vez en el directorio procedemos a asignarle una contraseña al usuario admin (por defecto sin contraseña) ejecutando el comando siguiente:

# ./asadmin change-admin-password –domain_name domain1

Enseguida aparecerá un diálogo donde proporcionaremos los datos que se piden (en negrita):

Enter admin user name [default: admin]> admin
Enter the admin password> <Oprimir Tecla Entrar o Intro> 
Enter the new admin password>  la_nueva_contraseña
Enter the new admin password again> la_nueva_contraseña
Command change-admin-password executed successfully.

Donde la_nueva_contraseña es la contraseña que se le va a asignar al usuario admin.

Ahora que el usuario admin tiene contraseña, procedemos a activar el acceso remoto seguro:

# ./asadmin enable-secure-admin –port 4848

El comando nos responderá:

You must restart all running servers for the change in secure admin to take effect.

Que nos indica que hay que reiniciar Payara para que los cambios se hagan efectivo. Así que paramos e iniciamos Payara con el dominio por defecto (domain1):

# ./asadmin stop-domain domain1

# ./asadmin start-domain domain1 

Una vez que inicie Payara podemos acceder de forma remota accediendo a la siguiente dirección:

https://[IP o Nombre sel servidor]:4848

El navegador señalará una advertencia de seguridad, ya que no se a instalado un certificado válido. Indique al navegador que asume el riesgo. Nos aparecerá la consola de administración de Payara:

Selección_471Proporcionamos el usuario y contraseña anteriormente asignada y entraremos a la consola de administración de Payara:

Selección_472

Espero y les sirva.

¡Visita los anuncios!

Microservicios

Las grandes empresas que dan servicios en la nube como Netflix, Amazon y muchas más están usando y/o migrando a Microservicios.

¿Que son los Microservicios? Los Microservicios son un patrón de Arquitectura de Sofware, es decir, una forma de cómo “construir” nuestras aplicaciones de software.

Por lo general nuestra aplicación web, desarrollada en java, la “empaquetamos” en un sólo paquete (válgame la redundancia), al que llamamos archivo .war y  que más adelante lo instalamos o desplegamos en nuestro servidor de aplicaciones. En ese único paquete van todas nuestras entidades, servicios, conexiones a base de datos, etc.; todos los objetos que conforman las diferentes capas que conforman nuestra aplicación web. Utilizamos lo que se llama una Arquitectura Monolítica.

Con la llegada de la computación en “la Nube” la Arquitectura Monolítica de las aplicaciones web empezó a ser ineficiente. A la hora de asignar más recursos computacionales y escalar este tipo de aplicaciones resultaba costoso. En ocasiones es necesario, por ejemplo, escalar sólo un proceso de nuestra aplicación y no toda la aplicación en su conjunto.

Con los Microservicios se divide la aplicación en piezas funcionales y desacopladas, donde cada una de esas piezas es una aplicación y se despliega o se instala independientemente de la otra. De esta forma se puede escalar y asignar recursos sólo una de estas aplicaciones que lleva a cabo una función específica dentro del sistema y no todas en su conjunto.

Para una explicación más detallada de lo que son los microservicios y para qué sirven, te recomiendo este sitio.

¡Saludos!

 

Primefaces: datatable editable no regresa el nuevo valor de la celda ni la rowkey en el evento CellEditEvent.

Antes que nada ¡Feliz año nuevo a todos! Que cumplan todas sus metas este año y en los venideros…

Ahora si, entremos en materia. Actualmente trabajo con la versión 5.3 de Primefaces y todo iba correctamente hasta que me topé con esta cuestión. El evento CellEditEvent no me regresaba valores en los métodos getNewValue y getRowKey. El primero se supone que me debería regresar el nuevo valor capturado en la celda y el segundo el valor único que identificaba a la fila (row) del DataTable sin embargo no era así. Así que me puse a buscar y las soluciones que daban, no funcionaban. Hasta que me puse a examinar minuciosamente los ejemplos del sitio de Primefaces (showcase) y compararlo con mi código y ahí resolví una de las incógnitas:

Mientras que el código de mi CDI bean obtenía los datos que llenaban la datatable de un método que hacía una consulta a la base de datos, en el ejemplo, la cargaban de una propiedad en el bean que era inicalizada previamente al construir el bean a través de un método etiquetado @PostConstruct; cabe aclarar que ambos bean tenian el alcance @ViewScoped. Así que procedí a agregar una propiedad en mi bean y el método que la inicializara con los datos de la base de datos  y agregar su respectivo getter y setter. ¡Vualá! El evento CellEditEvent me regresó el nuevo valor de la celda, sin embargo el valor RowKey de la fila donde se encontraba la celda editada seguía sin tener valor.  En los ejemplos no mostraban como obtener este dato, sólo mostraban como obtener el nuevo y antiguo valor.

Para resolver la segunda incógnita, volví a busca ahora algo de como obtener el RowKey en el evento pero no encontré mucha información, sin embargo en las páginas relacionaban mucho el RowKey con los métodos de selección  del DataTable así que le agregué la propiedad selectionMode=”single” a la datatable y ¡eureka! ¡el evento CellEditEvent me regresó el valor requerido!

En resumen, para solucionar el problema fue necesario agregar una propiedad local en el CDI bean que almacenara la lista de datos que llenarían el DataTable y en la definición de la datatable, en el archivo .xhtml, añadir y asignar “single” a la propiedad selectionMode.

Espero les sirva. ¡No se olviden de visitar a los patrocinadores!

java.lang.IllegalStateException: getOutputStream() has already been called for this response. Glassfish 4.1.1.

Desde hace un tiempo, utilizo Glassfish como servidor de aplicaciones en mis desarrollos web con Java. Sin embargo en el proyecto que actualmente trabajo, al descargar la última versión y querer añadir un nuevo pool de conexiones, la consola de administración gráfica de Glassfish 4.1.1 me arroja el siguiente error:

java.lang.IllegalStateException: getOutputStream() has already been called for this response.

Buscando la causa me encuentro que es un bug en esta nueva versión de Glassfish que aún no ha sido resuelto. Hay que recordar que Oracle dejó de dar soporte sobre este producto y por lo tanto, las correcciones de errores son más lentas que antes. En el misma dirección donde se reporta este bug se indica algunas soluciones.

Dentro de las soluciones, me enteré que existe una empresa que ha empezado otro desarrollo en base al código de Glassfish y realiza funciones de mantenimiento más prontas: Payara Server. Lo he descargado y funciona perfectamente hasta el momento. De ahora en adelante utilizaré este servidor de aplicaciones en futuros desarrollos.

¡Felices fiestas!

(Por favor visita a los patrocinadores).

 

Aplicación con Hibernate 5 no puede ser instalada en Glassfish 4.1.1.

No es posible hacer el deploy de una aplicación que contiene las librerías de Hibernate 5.0.3 a Glassfish 4.1.1. En ell archivo log manda el siguiente error grave:

El problema es la incompatibilidad de versiones de la librería jboss-logging.jar que usan dichas versiones de Hibernate y Glassfish. Reemplazando la librería jboss-logging.jar que se encuentra en glassfish/modules  con la librería versión 3.3.0 (jboss-logging-3.3.0.Final.jar) se soluciona el problema.

¡No olvides dar click en los anuncios!

¡Saludos!