miércoles, 24 de septiembre de 2025

Crear activator process en BW6 / BWCE

Cómo crear un activator process en BW6 / BWCE 

Hola.

Un activator process es el equivalente a un process starter de BW5. 

Cuando se realiza una migración de proyectos de BW5 a BW6, los process starters son convertidos a activator process (en el mejor de los casos) por lo que hay que validar que estos se generan de manera correcta en el proyecto migrado.

La mala migración de procesos con estas características o la conversión por procesos normales con actividades de inicio (timer, file poller, queue receiver, etc) puede generar un mal o diferente funcionamiento en la aplicación migrada.

Características de un activator process

  • Equivalente a process starter de BW5
  • Un activator process solo puede existir dentro de un application module. 
  • No puede ser creado dentro de un shared module.
  • Se ejecuta antes que cualquier proceso con actividades de inicio (timer, file poller, queue receiver...)

Uso

La importancia de un activator process radica en la capacidad de ejecutar actividades o subprocesos antes de cualquier otro proceso dentro de la aplicación.

Algunos ejemplos de esto son: inicializar variables compartidas, leer archivos, consultar base de datos, crear directorios, etc.  

Les dejo aquí abajo un video de cómo crear un activator process dentro de una aplicación de BusinessWorks 6 / BWCE.




Espero les sirva.

sábado, 2 de noviembre de 2024

Trascender

Trascender

El término trascendencia, trascendental o trascendente (del latín trascendens; trascender, superar, sobrepasar, ser mejor que otros, extenderse) indica la idea de sobrepasar o superar. Es el carácter de lo trascendente, es decir, lo que está más allá de lo perceptible y de las posibilidades de lo inteligible (comprensión) y se opone al concepto de inmanencia.

https://es.wikipedia.org/wiki/Trascendencia

domingo, 17 de septiembre de 2023

ORA-28001: The password has expired

ORA-28001: The password has expired

Hola.

Estoy obteniendo el error ORA-28001: The password has expired en una base de datos Oracle 19c. 

Esto provoca que las aplicaciones estén enviando errores al momento de conectarse a la base de datos usando estos usuarios. Los usuarios no están bloqueados pero se muestran como EXPIRED.

Para conocer el estatus de los usuarios se puede utilizar el siguiente query:

SELECT username, account_status, expiry_date FROM dba_users;

Importante mencionar que el error ORA-28001 es consecuencia de ignorar el error ORA-28002: the password will expire in 7 days 😅. Este error aparece primero y es una advertencia para actualizar el password del usuario en cuestión. Durante este tiempo la cuenta se pone en estado de EXPIRED(GRACE) indicando que el password debe ser actualizado.

ORA-28002: the password will expire in 7 days

Solución

Ls solución es actualizar el password del o los usuarios en cuestión. Preferentemente desde el momento de la advertencia pero también funciona cuando la contraseña ya expiró como en mi caso.

Ejecutar la siguiente instrucción para setear el password del usuario. 

La contraseña puede ser la misma, no necesariamente una nueva. Esto para evitar problemas con las aplicaciones. 

sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 17 15:39:43 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> ALTER USER myuser IDENTIFIED BY my password;
User altered.

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.

SQL> commit;

SQL> exit;

Muy importante ejecutar la instrucción commit para aplicar el cambio de profile.

Espero les sirva.


domingo, 23 de julio de 2023

El trabajo "SYSTEM"."SYS_IMPORT_FULL" se ha parado debido a un error fatal

El trabajo "SYSTEM"."SYS_IMPORT_FULL" se ha parado debido a un error fatal

Hola.

Estoy obteniendo el siguiente error al intentar importar una base de datos Oracle 19c con la utilidad impdp

Importante mencionar que estoy haciendo un full import por lo que es requisito que todos los tablespaces de la base de datos fuente existan en la base de datos destino.

Oracle-impdp-SYSTEM-SYS_IMPORT_FULL

C:\WINDOWS\system32>impdp FULL=y DUMPFILE=230710EXPDAT.DMP LOGFILE=full_log_import.log
Import: Release 19.0.0.0.0 - Production on Dom Jul 23 14:07:20 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

Usuario: system
Contrase±a:

Conectado a: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

La tabla maestra "SYSTEM"."SYS_IMPORT_FULL_05" se ha cargado/descargado correctamente
Iniciando "SYSTEM"."SYS_IMPORT_FULL_05": system/******** FULL=y DUMPFILE=230710EXPDAT.DMP LOGFILE=full_log_import.log
Procesando el tipo de objeto DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER
Procesando el tipo de objeto DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER
Procesando el tipo de objeto DATABASE_EXPORT/TABLESPACE
ORA-39014: Uno o mßs trabajos han salido antes de tiempo.
ORA-39029: el trabajo 1 con el nombre de proceso "DW00" ha terminado antes de tiempo
ORA-39014: Uno o mßs trabajos han salido antes de tiempo.
ORA-39029: el trabajo 2 con el nombre de proceso "DW00" ha terminado antes de tiempo
El trabajo "SYSTEM"."SYS_IMPORT_FULL_05" se ha parado debido a un error fatal en Dom Jul 23 14:10:40 2023 elapsed 0 00:03:00


Solución

Primero hay que revisar el alert log para tener mas información acerca del error.

El alert log se encuentra en una ruta similar a esta (BACKGROUND_DUMP_DEST): F:\app\oracle\diag\rdbms\{dbname}\{sid}\trace\alert_{dbname}.log

Al analizar el contenido del alert log encuentro el siguiente error:

2023-07-23T14:07:56.542039-04:00
Exception [type: INT_DIVIDE_BY_ZERO, ] [] [PC:0x7FFCCA342CE2, skgfrcre()+450]
Errors in file F:\APP\ORACLE\diag\rdbms\cmsdrdb\cmsdrdb\trace\cmsdrdb_dw00_8884.trc (incident=15825):
ORA-07445: se ha encontrado una excepción: volcado de memoria [skgfrcre()+450] [INT_DIVIDE_BY_ZERO] [] [PC:0x7FFCCA342CE2] [] []
Incident details in: F:\APP\ORACLE\diag\rdbms\cmsdrdb\cmsdrdb\incident\incdir_15825\cmsdrdb_dw00_8884_i15825.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.

El error se encuentra justo después de un comando CREATE TABLESPACE. Este tablespace no estaba creado en la base de datos destino por lo que no puede encontrarlo. 

Con esta información verifico que todos los tablespaces de la base de datos fuente existan en la base de datos destino. La ubicación de los datafiles puede ser diferente pero los tablespaces deben existir con el mismo nombre. Esto es un requisito para un full import.

SQL> select name from v$tablespace;

Después de crear el tablespace faltante, repito la instrucción de import impdp y finalmente puedo importar la base de datos.

El trabajo "SYSTEM"."SYS_IMPORT_FULL_06" ha terminado con 14 error(es) en Dom Jul 23 14:52:37 2023 elapsed 0 00:07:18

Espero les sirva.

jueves, 13 de julio de 2023

ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado

ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado 

Hola.

Estoy teniendo el siguiente error al intentar importar un backup de base de datos de Oracle 19c con el comando impdp justo después la creación de una nueva base de datos.

C:\WINDOWS\system32>impdp system/pwd@myhost:1521/MYINSTANCE FULL=y DUMPFILE=FILEEXPDAT.DMP LOGFILE=full_log_import.log

Import: Release 19.0.0.0.0 - Production on MiÚ Jul 12 19:58:41 2023

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

UDI-12154: la operación ha generado un error ORACLE 12154

ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado

El error es un tanto genérico porque no ofrece mucha información y las causas pueden ser diversas. 

En mi caso particular es importante mencionar que la base de datos está recién creada y este comportamiento ya lo he experimentado con una base de datos nueva.

Solución

  • Verificar que existe el archivo tnsnames.ora en la siguiente ubicación: $ORACLE_HOME/network/admin/tnsnames.ora

Si no existe el archivo, crearlo manualmente y generar una entrada con la descripción del servicio en el siguiente formato:

MYSERVICE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-1KG2CLC)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYSERVICE)
)
)

  • En la misma ubicación, verificar que el archivo sqlnet.ora contenga TNSNAMES en el parámetro NAMES.DIRECTORY_PATH

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

  • En este punto verificar si la aplicación ya reconoce el servicio y puede conectarse.
Se puede verificar que el servicio responde usando la utilidad tnsping

$ORACLE_HOME\bin>tnsping MYSERVICE
  • En este y otros casos es importante que el listener esté prendido cuando se inicia la base de datos para que reconozca la instancia de Oracle.  

Lo primero que hay que revisar es que el listener esté activo y que tenga comunicación con la instancia/servicio de Oracle. Para esto ejecutar la siguiente instrucción en un command prompt:

C:\WINDOWS\system32>lsnrctl status

LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production on 12-JUL-2023 19:57:24

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Conectßndose a (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

TNS-12541: TNS:no hay ningún listener

 TNS-12560: TNS:error del adaptador de protocolo

  TNS-00511: No hay ningún listener

   64-bit Windows Error: 61: Unknown error

Como se ve en este caso, el estatus del listener está apagado por lo que hay que prenderlo pero debe ser en el siguiente orden que incluye reiniciar la base de datos.

1.- En otro command prompt conectarse a la base de datos y apagarla con el comando: shutdown immediate

Oracle shutdown immediate

2.- En el otro command prompt prender el listener con el comando: lsnrctl start

oracle listener lsnrctl start

*Si es necesario se puede usar también el comando: lsnrctl stop

3.- En el command prompt de la base de datos, iniciar la base de datos con el comando: startup

oracle startup command

Al iniciarse la base de datos, el listener la va a reconocer y reportar como un servicio disponible.

4.- Por último, verificar el estatus del listener con el comando: lsnrctl status

lsnrctl status command

Con este orden de reinicio pude corregir el error inicial que tenía.

Espero les sirva.


viernes, 7 de julio de 2023

PostgreSQL ERROR: relation “table” does not exist 42P01

PostgreSQL ERROR: relation “table” does not exist 42P01 


Hola.

PostgreSQL está devolviendo el siguiente error al ejecutar un stored procedure que utiliza diversas tablas dentro de una base de datos.

SQL Exception occurred (SQL STATE = 42P01) - detailMessage - ERROR: relation “table” does not exist

PostgreSQL ERROR: relation “table” does not exist



Importante mencionar que el stored es reconocido y ejecutado sin problemas pero las tablas que se utilizan dentro provocan el error al momento de ejecución. 

El stored está firmado con el nombre del esquema pero las tablas no tienen la firma del esquema.

Solución.

La línea de conexión a la base de datos tanto en pgAdmin como en la aplicación están usando el parámetro currentSchema con el nombre del esquema de las tablas y es aquí donde se encontraba el problema.

jdbc:postgresql://dev-host.com:5432/dev_db?currentSchema=myschema

En la línea de conexión, el parámetro currentSchema debe estar en camel case format para que el esquema sea reconocido en la conexión y por lo tanto las tablas del esquema también lo sean.


Espero les sirva.


domingo, 21 de mayo de 2023

Ver errores descriptivos de ASP clásico en navegador con IIS 10

Cómo ver errores descriptivos de ASP clásico en navegador con IIS 10 

Hola.

Enviar los errores de ejecución a navegador no están habilitados por default en IIS 10 por lo que se tienen que activar manualmente.

El error genérico que se ve en un navegador cuando hay un error de ejecución de código ASP classic es el siguiente: 

An error occurred on the server when processing the URL. Please contact the system administrator.

If you are the system administrator please click here to find out more about this error.

Este error no es descriptivo y no ayuda en nada para debuguear algún problema con el código por lo que hay que hacer lo siguiente para ver el error descriptivo.

Esta solución asume que ya han instalado la opción de ASP clásico desde Add or remove Windows Features.

Solución.

1.- Ir al sitio desde IIS manager

2.- Seleccionar el icono de ASP

3.- Expandir Debug Properties y cambiar la opción Send Errors to Browser a true

IIS 10 - Send Errors to Browser a true

Después de esto hay que volver a refrescar la dirección para ver el error.

Espero les sirva.

martes, 11 de abril de 2023

Oracle out parameter se trunca a la mitad

Oracle out parameter se trunca a la mitad de caracteres

Hola.

Estoy teniendo un problema en la llamada a un stored procedure de Oracle 19c

El problema consiste en que tengo definido un parámetro de salida de tipo VARCHAR2 en el stored procedure que al ser ejecutado devuelve el campo pero lo corta a la mitad de caracteres.

Ejemplo:

"hola_mundo" -> "hola_" 

Esto está ocasionando problemas de funcionamiento porque el valor completo es requerido para la autenticación de la aplicación. 

La versión de base de datos que estoy usando es Oracle 19c en Windows Server y la aplicación web es ASP.NET 4.8 con C# 

Es importante mencionar que tanto la versión de .NET como la versión de base de datos están siendo actualizadas. Anteriormente la versión .NET era 4.0 y la versión de Oracle era 11g.

Solución.


La solución de este problema es cambiar el tipo del parámetro de salida de VARCHAR2 a CHAR.

PROCEDURE SP_LGN_WS(p_status OUT NUMBER, p_roles OUT VARCHAR2)

Cambiar por:

PROCEDURE SP_LGN_WS(p_status OUT NUMBER, p_roles OUT CHAR)

Con este cambio el parámetro de salida devuelve el campo completo.

*Otro de los problemas que existen es que la aplicación usa la siguiente librería obsoleta: System.Data.Oracle.Client
La cual ya no es recomendada para trabajar con Oracle. 


Espero les sirva.

martes, 7 de marzo de 2023

DelegatingCallableStatement cannot be cast to class OracleCallableStatement

java.lang.ClassCastException 


Hola.

Estoy obteniendo el siguiente error al intentar ejecutar mi aplicación de TIBCO BusinessWorks 6

java.lang.ClassCastException: class org.apache.commons.dbcp2.DelegatingCallableStatement cannot be cast to class oracle.jdbc.OracleCallableStatement (org.apache.commons.dbcp2.DelegatingCallableStatement and oracle.jdbc.OracleCallableStatement are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @71cea1b8)

La siguiente linea causa el error:

rs = ((OracleCallableStatement)stmt).getCursor(3);

Esta aplicación fue migrada de la versión 5 y utilizaba una actividad Get Connection que ya no existe en la versión 6 por lo que se han auto generado clases de Java para proveer la misma funcionalidad.

Dentro de estas clases se utilizan clases de conexión a base de datos genéricas en forma de wrapper ya que la aplicación puede manejar diversos maneadores de base de datos. Esta es la razón del error al intentar hacer cast de un objeto de tipo DelegatingCallableStatement a un objeto de tipo OracleCallableStatement

Esto aplica para variables de tipo conexión y statement del paquete Java.sql

Solución

Lo que hay que hacer es quitar el wrapper al objeto utilizando el método unwrap para dejarla en su tipo de clase original la cual hay que especificar como parámetro del mismo método.
 
rs=((OracleCallableStatement)stmt.unwrap(OracleCallableStatement.class)).getCursor(3);


Espero les sirva.

miércoles, 25 de enero de 2023

Dónde está instalado Java en Mac

Dónde está instalado Java en Mac

Hola.

He descargado e instalado una nueva versión de Java en Mac y ahora necesito saber en donde está instalado porque requiero hacer más configuraciones que dependen de la ubicación de Java.

También necesito saber la version default que tengo configurada.

Solución.

Para encontrar el home directory de la version Java mas reciente instalada, ejecutar el siguiente comando en una Terminal de Mac

/usr/libexec/java_home

mac java home

Para saber la ubicación del Java home de una versión en específico se puede agregar el parámetro -v con la versión a buscar. 

/usr/libexec/java_home -v 1.7

jhernand-MBP13:~ jhernand$ /usr/libexec/java_home -v 1.7
/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home

 

Espero les sirva.

miércoles, 28 de diciembre de 2022

ORA-00904: "I"."UNUSABLEBEGINNING#": invalid identifier

 ORA-00904: "I"."UNUSABLEBEGINNING#": invalid identifier

Hola.

Estoy obteniendo el siguiente error al tratar de levantar una base de datos de Oracle 11g en una nueva base de datos Oracle 19c. 

Estoy intentando una migración de base de datos de Oracle 11g a una Oracle 19c pluggable database. Obtengo el siguiente error cuando estoy intentando abrir la base de datos con el comando startup.

ORA-00603: ORACLE server session terminated by fatal error 
ORA-01092: ORACLE instance terminated. Disconnection forced 
ORA-00704: bootstrap process failure 
ORA-00604: error occurred at recursive SQL level 1 
ORA-00904: "I"."UNUSABLEBEGINNING#": invalid identifier Process ID: 92131 
Session ID: 11 Serial number: 25309

Solución

Para poder abrir la base de datos utilizar la opción upgrade del comando startup:

SQL> startup upgrade

Esta instrucción permite iniciar la base de datos en modo upgrade y poder accederla para completar el proceso de migración. 

*Esta solución no es definitiva debido a que se tiene que ejecutar cada que se quiere levantar la base de datos. Se requiere finalizar el proceso de migración completo que incluya la restauración completa de la base de datos en un nuevo servidor.


Espero les sirva.


lunes, 18 de julio de 2022

Error al ejecutar jar "no main manifest attribute"

Error al ejecutar jar "no main manifest attribute"

Hola.

Obtengo el siguiente error al intentar ejecutar un jar desde consola con el comando java -jar

La opción -jar sólo funciona con archivos JAR ejecutables por lo que estos deben tener un manifest con el atributo Main-Class especificado. 

En mi caso es un jar que no contiene un manifest dentro por lo que es necesario especificar los paquetes de la aplicación

Ejecutar jar "no main manifest attribute"

Les dejo aquí la siguiente secuencia de comandos que ejecute para ejecutar el jar y para buscar la estructura de paquetes de la aplicación:

jangel-MBP13:target jhernand$ java -jar myFirstApp-1.0-SNAPSHOT.jar

no main manifest attribute, in myFirstApp-1.0-SNAPSHOT.jar

jangel-MBP13:target jhernand$ 

jangel-MBP13:target jhernand$ java -cp myFirstApp-1.0-SNAPSHOT.jar MyGroup.MyFirstApp

Error: Could not find or load main class MyGroup.MyFirstApp

Caused by: java.lang.ClassNotFoundException: MyGroup.MyFirstApp

jangel-MBP13:target jhernand$ ls ../src/main/

java

jangel-MBP13:target jhernand$ ls ../src/main/java/

MyGroup

jangel-MBP13:target jhernand$ ls ../src/main/java/MyGroup/

App.java

jangel-MBP13:target jhernand$ java -cp myFirstApp-1.0-SNAPSHOT.jar MyGroup.App

Holaaaa mundoooo!

jangel-MBP13:target jhernand$ 


La aplicación es un simple Hola Mundo usado como ejemplo.

Referencias:

https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute

Espero les sirva.

jueves, 14 de julio de 2022

[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.

Resolver [ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.

Hola.

Estoy obteniendo el siguiente error al ejecutar el goal docker:build con Maven en mi aplicación de TIBCO BusinessWorks Container Edition.

[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.
[ERROR] Target option 1.5 is no longer supported. Use 1.6 or later.


Este error se debe a la configuración que tengo del plugin maven-compiler-plugin

Tengo la siguiente versión de maven (3.8.5) y jdk (11) instalados en mi máquina:

jangel-MBP13:tmpjmsplugin jhernand$ mvn -version

Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)

Maven home: /usr/local/Cellar/maven/3.8.5/libexec

Java version: 11.0.14, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-11.0.14.jdk/Contents/Home

Default locale: en_US, platform encoding: UTF-8

OS name: "mac os x", version: "10.15.7", arch: "x86_64", family: "mac"

jangel-MBP13:tmpjmsplugin jhernand$ 


maven java javac version

Al parecer el error se debe a que desde la version 3.8.0 el valor default del maven-compiler-plugin cambio de 1.5 a 1.6

Solución


Para corregirlo hay que modificar las propiedades de target y source del plugin maven-compiler-plugin en el archivo pom.xml de la aplicación. 

Estoy utilizando la versión de JRE que se tengo instalado. Para saber la versión ejecuto:

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

jangel-MBP13:tmpjmsplugin jhernand$ /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

java version "1.8.0_331"

Java(TM) SE Runtime Environment (build 1.8.0_331-b09)

Java HotSpot(TM) 64-Bit Server VM (build 25.331-b09, mixed mode)

jangel-MBP13:tmpjmsplugin jhernand$ javac -version

javac 11.0.14

jangel-MBP13:tmpjmsplugin jhernand$


La siguiente configuración el archivo pom.xml funcionó para mi.

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>

Con este cambio el error debe quedar corregido y se puede volver a intentar el goal.

Referencias:


Espero les sirva.

miércoles, 13 de julio de 2022

Desplegar Aplicación TIBCO BusinessWorks Container Edition en Docker con Azure Artifacts

Cómo desplegar Aplicación TIBCO BusinessWorks Container Edition en Docker con Azure Artifacts

Hola.

En este post voy a describir cómo desplegar una aplicación REST con TIBCO BusinessWorks Container Edition usando Docker container con Azure Artifacts.

Mi aplicación es un servicio REST que recibe un request y publica un mensaje a una queue de EMS con la información recibida. 

En este caso requiero que las librerías de TIBCO EMS se encuentren en el repositorio y que sean descargadas al momento de construir la aplicación e incluidas en la imagen de Docker generada. Con esto al iniciar mi contenedor estas dependencias son resueltas y la aplicación se ejecute correctamente. 

Conexión a Azure Artifacts

Lo primero que tienen que tener configurado en el proyecto es una conexión a un Feed Artifact de Azure.

En la sección de Azure Artifacts, seleccionar el feed deseado y la opción Connect to Feed para ver la información de conexión al Feed desde nuestro proyecto. En esta sección se encuentra toda la información referente a la configuración de la conexión del Feed al proyecto.

1.- Editar el archivo settings.xml (Este se encuentra en la instalación de Maven: /opt/apache-maven-3.5.0/conf o también en el user home ${user.home}/.m2, se puede crear si no existe). Agregar el elemento de server siguiente: 

<servers>
.
.
<server>
<id>MiFeed</id>
<username>miusuario</username>
<password>[PERSONAL_ACCESS_TOKEN]</password>
</server>
</servers>

El Personal Access Token se genera desde ahi mismo siguiendo las instrucciones para generarlo con Packaging read & write scopes.

2.- Colocar los elementos: repositories y repository dentro del archivo POM de la aplicación. Los datos de conexión de estos elementos están disponibles en Azure Artifacts > Connect to Feed. Algo similar a lo siguiente

<project>
.
.
<repositories>
<repository>
<id>MiFeed</id>
<url>https://pkgs.dev.azure.com/micompany/miservicio/_packaging/MiFeed/maven/v1</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</project>


Hasta este punto tenemos conexión al Artifact Feed de Azure desde nuestro proyecto de TIBCO BusinessWorks Container Edition.

Subir plugins al feed con mvn deploy:deploy-file

Para subir los archivos hacia el repositorio se utiliza la instrucción de Maven deploy-file. En el caso particular de las librerías de EMS, es necesario primero empaquetar las librerías de la siguiente manera

1.- Copiar las carpetas desde /opt/tibco/ems/8.6/components/shared/1.0.0/plugins hacia una carpeta temporal con la siguiente estructura: runtime/plugins

2.- Crear un archivo zip de la carpeta runtime y asignarle un nombre descriptivo para las librerías como en la siguiente imagen: TIB_bwpluginjms_8.6.0_bwce-runtime.zip

Este nombre se usará en la instrucción deploy-file

*Podría ser también un archivo con extensión .jar

La estructura de directorios y archivo zip final deben verse como en la siguiente imagen.

EMS libraries runtime plugins

3.- Para subir el archivo zip antes generado con las librerías de EMS se utiliza la siguiente instrucción desde la carpeta donde se encuentra el archivo:
Los nombres de groupId, artifactId y versión dependen del paquete que se suba así como de la organización de nombres de archivos que se requiera.

mvn deploy:deploy-file -Dpackaging="zip" -DrepositoryId="MiFeed" -Durl="https://pkgs.dev.azure.com/micompany/miservicio/_packaging/MiFeed/maven/v1" -DgroupId="com.tibco.jms" -DartifactId="plugin" -Dversion="8.6.0.004" -Dfile="TIB_bwpluginjms_8.6.0_bwce-runtime.zip"

Agregar dependencias al proyecto en el POM application


Después de subir las librerías al repositorio o Feed ya pueden ser referenciadas desde un proyecto de BWCE. Para lograr esto, dentro del archivo POM de la aplicación es necesario agregar las dependencias que se encuentran en el repositorio externo.

1.- Ir a la URL del repositorio y seleccionar el Artifact deseado.
2.- En la pestaña Overview > Get this Package > Maven
Seleccionar el fragmento de XML para agregar al archivo POM de la aplicación. Algo similar a lo siguiente:

<dependency>
<groupId>com.tibco.jms</groupId>
<artifactId>plugin</artifactId>
<version>8.6.0.004</version>
<type>zip</type>
</dependency>


3.- Ir al proyecto de BWCE y pegar el fragmento XML en el POM de la aplicación (ej. MiProyecto.application/pom.xml). Agregar el elemento type como zip porque en este caso las librerías fueron subidas en ese formato. El valor por default es jar

<project>
.
.
<dependencies>
<dependency>
<groupId>com.tibco.jms</groupId>
<artifactId>plugin</artifactId>
<version>8.6.0.004</version>
<type>zip</type>
</dependency>
</dependencies>
</project>

Al momento de incluirlo en el archivo, y estar configurada la conexión a Azure Artifacts - Feed, la dependencia es descargada automáticamente en el folder local ${user.home}/.m2/repository con lo que se vuelve disponible para el proyecto.

Agregar dependencias en Docker image build


Con las dependencias incluidas en el proyecto, es necesario referenciarlas en el build de la imagen Docker que se genera al ejecutar el goal docker:build

Para esto hay que modificar el archivo POM de la aplicación (ej. MiProyecto.application/pom.xml) agregando el elemento de assembly como en el ejemplo siguiente:


<image>
.
.
<assemblies>
<assembly>
<basedir>/</basedir>
<descriptorRef>artifact</descriptorRef>
</assembly>
<assembly>
<name>plugins</name>
<descriptorRef>dependencies</descriptorRef>
<targetDir>/resources/addons/plugins</targetDir>
</assembly>
</assemblies>
</image> 

Esta configuración va a producir la siguiente estructura de directorios y Dockerfile. 

target-build-dockerfile

Posteriormente la imagen de Docker será construida incluyendo las dependencias del repositorio y las colocará en la ruta del contenedor especificada en el elemento XML assembly/targetDir. En este caso: /resources/addons/plugins

En el caso de las librerías EMS es necesario colocarlas en el folder plugins (/resources/addons/plugins) con el formato comprimido pues de ahí son tomadas y copiadas al momento de desplegar la aplicación en el contenedor.

Desplegar aplicación BWCE desde Business Studio


Con todos los cambios de arriba realizados y probada la conexión al repositorio de Artifacts de Azure desde el proyecto de BWCE, realizar el despliegue utilizando los siguientes goals de Maven:

docker:build

clean package initialize com.tibco.plugins:bw6-maven-plugin:bwfabric8json docker:build

docker:start

initialize docker:start -Ddocker.property.file=docker-dev.properties

Con todo esto hecho ya deben poder ver su contenedor iniciado con las dependencias de EMS resueltas exitosamente.

Les dejo un video de cómo desplegar Aplicación TIBCO BusinessWorks Container Edition en Docker con Azure Artifact.


Espero les sirva.

lunes, 11 de julio de 2022

Unable to read data from the transport connection: net_io_connectionclosed

Resolver Unable to read data from the transport connection: net_io_connectionclosed


Hola.

Estoy obteniendo el siguiente error al hacer envíos de correo electrónico utilizando ASP.NET. Estoy utilizando el Framework 4.0 

El error completo es el siguiente:

20220704 12:30:32 : Application Mail Error: System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed.

   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)

   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)

   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)

   at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response)

   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)

   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   --- End of inner exception stack trace ---

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   at Models.Funciones.enviarEmailRegistroActivacion(SegmentoModel _model) in C:\www\www.misitio.com\Models\Funciones.cs:line 166


La razón es que Microsoft ha dejado de dar soporte para TLS1.0 y TLS1.1 para los endpoints default de SMTP. En mi caso smtp.office365.com

El problema es que las definiciones de SecurityProtocolType.Tls11 y SecurityProtocolType.Tls12 no están definidas en en el Framework 4.0 por lo que se tienen que especificar con una representación numérica de estos valores.

Abajo dejo el bloque de código con la linea de código que agregué para hacer funcionar el envío de correos. 

ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

net_io_connectionclosed

Solución.


La configuration de envío que estoy usando es similar a la siguiente en donde he agregado el atributo enableSsl="true" a mi configuración smtp. Si no lo hiciera desde ahí se tiene que agregar en el código mismo.

<system.net>
  <mailSettings>
      <smtp from="noreply@noreply.net">
    <network host="smtp.office365.com" password="mipassword" port="587" userName="micuenta@misitio.com" enableSsl="true" />
      </smtp>
   </mailSettings>
</system.net>

Estoy usando el siguiente código para realizar el envío de correo electrónico, en negritas lo que he agregado:

public static void enviarEmailRegistroActivacion(RegistrarUsuarioSegmentoModel _model)
{
var bodyMail="";
MailAddress a = new MailAddress(_model.EMAIL);
MailAddress de = new MailAddress(p_FromMail);
MailMessage message = new MailMessage(de, a);

if (p_bcc_email.Length > 0)
{
MailAddress bcc = new MailAddress(p_bcc_email);
message.Bcc.Add(bcc);
}

message.IsBodyHtml = true;
message.Subject = "Activación de cuenta para ingreso";

bodyMail = "<p>Hola " + _model.NOMBRE + ".</p>";
bodyMail += "Recibimos sus datos correctamente.<br/>";
bodyMail += "<p>Atentamente,</p>";

message.Body = bodyMail;
// Use the application or machine configuration to get the
// host, port, and credentials.
//Allow TLS 1.0, 1.1 and 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

SmtpClient client = new SmtpClient();
//client.EnableSsl=true;
try
{
client.Send(message);
}
catch (Exception ex)
{
Funciones.GrabaArchivo(ArchivoLog, "Application Mail Error: " + ex.ToString(), true);
}
}        

Si no se agrega la propiedad EnableSsl, obtengo el siguiente error:
 

20220704 13:01:17 : Application Mail Error: System.Net.Mail.SmtpException: Error in processing. The server response was: 5.7.3 STARTTLS is required to send mail [MN2PR15CA0060.namprd15.prod.outlook.com]

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)

   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)

   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)


Con estos cambios, volver a generar el proyecto e intentar el envío de correo nuevamente.
La recomendación para resolver este problema es moverse a un Framework más actual para evitar este escenario de error.

Referencias:


Espero les sirva.

sábado, 25 de junio de 2022

Explorar archivos de un contenedor Docker

Cómo explorar archivos de un contenedor Docker

Hola.

Al utilizar contenedores de Docker en ocasiones es necesario saber qué es lo que está pasando dentro del contenedor.

Algunas cosas que se requieren saber comúnmente son: saber la estructura del sistema de archivos, las rutas importantes dentro del contenedor, los archivos incluidos en el contenedor como resultado de las instrucciones del Dockerfile, los comandos disponibles dentro del contenedor, etc.

docker exec

Para poder ingresar a un contenedor Docker que se encuentra ejecutándose (Docker run) se utiliza la siguiente instrucción utilizando el nombre o el id del contenedor. Si es el id, con los tres primeros dígitos es suficiente.    

docker exec -t -i nombrecontenedor /bin/bash

docker exec -t -i /bin/bash

Esta instrucción permite entrar a los archivos del contenedor en ejecución. Una vez dentro se puede explorar los folders utilizando los comandos comunes de exploración como es: ls (list), cd (change dir)

Para mayor referencia del comando docker exec, ver la documentación en linea de la página de documentación de Docker:

https://docs.docker.com/engine/reference/commandline/exec/

Espero les sirva.



viernes, 10 de junio de 2022

Ejecutar programa en silent mode en Windows

Cómo ejecutar programa en silent mode en Windows

Ejecutar aplicaciones en silent mode es muy útil cuando queremos dejar corriendo algo sin preocuparnos por el estado de la aplicación. 

Generalmente se usa para aplicaciones de las cuales no se requiere mucha información sobre su ejecución.

También sirve para no dejar ventanas abiertas con programas ejecutándose porque es estorboso. También es riesgoso cerrar una ventana por accidente y terminar con la ejecución de una aplicación. 

Para ejecutar un programa en silent mode:

Abrir un command prompt y moverse a la ruta donde se encuentra el .exe
Dependiendo del programa y los permisos que requiera, abrir el command prompt como administrador o de manera normal.

Ejecutar el comando similar al de abajo:

C:>"C:\programas\miprograma.exe" > "C:\programas\output.txt"

Ejecutar silent mode windows

El comando va a ejecutarse en silent mode y va a escribir todos los logs de la ejecución en el archivo output.txt 

Espero les sirva.




jueves, 9 de junio de 2022

Crear base de datos Oracle 19c en windows

Cómo crear base de datos Oracle 19c en windows

Hola.

Este post es para explicar cómo crear una nueva base de datos de Oracle 19c en una máquina con Windows

Oracle es un gestor de base de datos muy popular en la industria que permite administrar la información de una organización de manera eficaz. Puede manejar altos volúmenes de información, diversos niveles de seguridad, importar y exportar la información, recuperación de datos, etc.

Para este post ya deben tener instalado el software de Oracle 19c en su computadora. En mi post anterior explico como realizar esta instalación: https://jmartinhc.blogspot.com/2022/06/instalar-oracle-database-19c-en-windows.html

Para la creación de una base de datos de Oracle 19c existen diferentes métodos. En este caso estoy utilizando el Database Configuration Assistant de Oracle 19c también conocido como dbca.

Lo primero que hay que hacer es ir a la ruta donde se encuentra el ejecutable dbca y ejecutarlo. Esta ruta se encuentra dentro del path ORACLE_HOME. La ruta debe ser similar a la siguiente:

C:\app\oracle\product\19.0.0\dbhome_1\bin\dbca.exe

Una vez dentro del wizard de instalación, seleccionar las siguientes opciones o personalizar la instalación de acuerdo a lo que necesiten.

  • Database Operation: Create a database
  • Creation Mode: Typical configuration
    • Global database name
    • Administrative password
    • Pluggable database name

Les dejo un video de cómo crear una base de datos Oracle 19c con dbca en Windows.

Espero les sirva.


lunes, 6 de junio de 2022

Instalar Oracle Database 19c en Windows

Cómo instalar Oracle Database 19c en Windows 

Hola.

En este post describo cómo instalar Oracle Database 19c en Windows 10

1.- Descargar el software de instalación para Windows de la página de Oracle: https://www.oracle.com/mx/database/technologies/oracle19c-windows-downloads.html

El archivo descargado es: WINDOWS.X64_193000_db_home.zip

2.- Crear la estructura de directorios que será el path del ORACLE_HOME:

C:\app\oracle\product\19.0.0\dbhome_1

Extraer los archivos a este directorio.

3.- Dentro de la ruta del ORACLE_HOME ejecutar el archivo setup.exe para comenzar con el proceso de instalación.

4.- Seleccionar las opciones default de instalación:

  • Configuration Options: Setup Software Only. (Sin creación de base de datos)
  • Database Installation Options: Single instance database installation
  • Database Edition: Enterprise Edition
  • Oracle Home User: Use Virtual Account
  • Installation Location: C:\app\oracle\ (Este será el ORACLE_BASE)

5.- Clic en Close.

Después de esto el software de Oracle Database 19c ya se encuentra instalado y configurado en Windows.

Les dejo aquí un video de cómo realizar este procedimiento.

Espero les sirva.

jueves, 2 de junio de 2022

Registrar o eliminar TIBCO EMS de los servicios de Windows

Cómo registrar o eliminar TIBCO EMS de los servicios de Windows

Hola.

En este post voy a explicar cómo registrar o eliminar TIBCO EMS como servicio de Windows.

1.- Abrir una ventana de Command Prompt como Administrator

2.- Moverse hacia el path de TIBCO EMS:

cd C:\tibco\ems\8.5\bin

3.- Ejecutar el comando de registro del servicio tibemsd:

emsntsrg /i tibemsd C:\tibco\ems\8.5\bin C:\tibco\ems\8.5\bin "-config C:\tibco\ems\8.5\bin\tibemsd.conf" 7222

La sintaxis del comando es:

emsntsrg /i [/a]|[/d] tibemsd emsntsct_directory tibemsd_directory [arguments] [suffix]

Para mayor información acerca de los parámetros del comando: https://docs.tibco.com/pub/ems-vms/8.5.1/doc/html/GUID-A3B31012-F10A-47BC-9BA3-5676F7DCE350.html

4.- Revisar los servicios de Windows para verificar que el servicio ha sido registrado correctamente.

Para eliminar TIBCO EMS como servicio de Windows se utiliza la misma utilidad

emsntsrg /r tibemsd 7222

*Si se usa sufijo para registrar el servicio, es importante ponerlo para removerlo.

Les dejo un video de cómo registrar TIBCO EMS como servicio de Windows.


Espero les sirva.