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:
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
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.
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.
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:
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:
Esta configuración va a producir la siguiente estructura de directorios y 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:
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.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.
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.
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)