Hermes soporta el envío de notificaciones a 4 proveedores externos. Cada notificación tiene configurado en base de datos qué proveedores deben recibirla. La plataforma despacha de forma asíncrona e independiente a cada proveedor habilitado.
|
Proveedor |
Tipo |
Mecanismo |
|---|---|---|
|
|
Correo electrónico |
JavaMailSender (SMTP) |
|
Google Chat |
Mensajería corporativa |
Webhook HTTP |
|
Slack |
Mensajería de equipo |
Webhook HTTP |
|
Microsoft Teams |
Mensajería corporativa |
Power Automate Webhook |
1. Configuración en application.yaml
1.1 Google Chat
anjana:
messaging:
google-chat:
webhook-url: https://chat.googleapis.com/v1/spaces/XXXXXXXXX/messages?key=YYYYYYY&token=ZZZZZZZ
Cómo obtener la Webhook URL:
-
Abrir el Space de Google Chat destino
-
Hacer clic en el nombre del Space → Apps & integrations
-
Add webhooks → Asignar nombre → Save
-
Copiar la URL generada (incluye
keyytokencomo parámetros de query)
1.2 Slack
anjana:
messaging:
slack:
webhook-url: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX
Cómo obtener la Webhook URL:
-
Ir a api.slack.com/apps → Create New App
-
Incoming Webhooks → Activar → Add New Webhook to Workspace
-
Seleccionar el canal destino → Allow
-
Copiar la Webhook URL generada
1.3 Microsoft Teams
anjana:
messaging:
teams:
webhook-url: https://TENANT.webhook.office.com/webhookb2/XXXXXXXX@YYYYYYYY/IncomingWebhook/ZZZZZZZZ/WWWWWWWW
Nota importante: Teams ha deprecado los Office 365 Connectors. Es obligatorio usar Power Automate con el conector "Post to a channel when a webhook request is received".
Cómo configurar con Power Automate:
-
En Teams, ir al canal destino → ... → Workflows
-
Buscar "Post to a channel when a webhook request is received" → Add workflow
-
Dar nombre al flujo → Next → copiar la URL del webhook generado
1.4 Email (SMTP)
spring:
mail:
host: smtp.example.com
port: 587
username: notifications@example.com
password: ${MAIL_PASSWORD}
properties:
mail.smtp.auth: true
mail.smtp.starttls.enable: true
from: notifications@anjanadata.com
1.5 Timeouts HTTP (todos los proveedores webhook)
anjana:
messaging:
connectTimeoutSeconds: 10 # Tiempo máximo para establecer conexión
readTimeoutSeconds: 30 # Tiempo máximo esperando respuesta
writeTimeoutSeconds: 10 # Tiempo máximo enviando el request
1.6 Ejemplo de configuración completa
anjana:
messaging:
connectTimeoutSeconds: 10
readTimeoutSeconds: 30
writeTimeoutSeconds: 10
google-chat:
webhook-url: https://chat.googleapis.com/v1/spaces/XXXXXXXXX/messages?key=YYYYYYY&token=ZZZZZZZ
slack:
webhook-url: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX
teams:
webhook-url: https://TENANT.webhook.office.com/webhookb2/XXXXXXXX/IncomingWebhook/ZZZZZZZZ
spring:
mail:
host: smtp.gmail.com
port: 587
username: notifications@anjanadata.com
password: ${MAIL_PASSWORD}
properties:
mail.smtp.auth: true
mail.smtp.starttls.enable: true
mail:
from: notifications@anjanadata.com
2. Configuración en Base de Datos
El campo external_sending de la tabla hermes.notification controla qué proveedores reciben cada tipo de notificación. Es una lista de valores separados por comas.
2.1 Valores posibles
|
Valor |
Proveedor |
|---|---|
|
|
Correo electrónico |
|
|
Slack |
|
|
Microsoft Teams |
|
|
Google Chat |
2.2 Consultar configuración actual
SELECT
notification_code,
subject,
severity,
external_sending
FROM hermes.notification
ORDER BY notification_code;
3. Formato de los mensajes enviados
Cada proveedor recibe el mensaje con un formato específico generado automáticamente por Hermes. El asunto y el cuerpo se resuelven mediante las claves de traducción (translation_key) configuradas en cada notificación, en todos los idiomas activos en la plataforma.
3.1 Google Chat
{
"text": "Asunto de la notificación
Cuerpo completo de la notificación"
}
3.2 Slack
{
"text": "**Asunto de la notificación**
Cuerpo completo de la notificación"
}
3.3 Microsoft Teams (Adaptive Card)
{
"type": "message",
"attachments": [{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.2",
"body": [
{ "type": "TextBlock", "text": "Asunto de la notificación", "weight": "Bolder" },
{ "type": "TextBlock", "text": "Cuerpo de la notificación", "wrap": true }
]
}
}]
}
3.4 Email
Correo HTML enviado a los destinatarios configurados en la notificación, con el cuerpo construido en todos los idiomas activos en la instalación.
4. Pools de ejecución asíncrona
Cada proveedor usa un pool de threads propio para no bloquear el hilo principal. Son configurables en application.yaml:
anjana:
hermes:
mail-pool:
pool-size: 5
core-pool-size: 2
queue-capacity: 100
slack-pool:
pool-size: 3
core-pool-size: 1
queue-capacity: 50
teams-pool:
pool-size: 3
core-pool-size: 1
queue-capacity: 50
google-chat-pool:
pool-size: 3
core-pool-size: 1
queue-capacity: 50
|
Parámetro |
Descripción |
|---|---|
|
|
Máximo de threads concurrentes para ese proveedor |
|
|
Threads siempre activos (aunque no haya mensajes) |
|
|
Mensajes en cola antes de comenzar a rechazar |
5. Flujo de envío
Evento de workflow (task creada, asignada, completada...)
↓
NotificationService.dispatchToProviders()
↓
Para cada proveedor configurado en external_sending:
├── EMAIL → EmailService (mailPoolTaskExecutor)
├── SLACK → SlackService (slackPoolTaskExecutor)
├── MICROSOFT_TEAMS → TeamsService (teamsPoolTaskExecutor)
└── GOOGLE_CHAT → GoogleChatService (googleChatPoolTaskExecutor)
↓
POST webhook / envío SMTP
Los proveedores se invocan en paralelo y de forma asíncrona, por lo que un fallo en un proveedor no bloquea ni afecta a los demás.
6. Verificación y troubleshooting
6.1 Verificar conectividad con curl
# Google Chat
curl -X POST \
"https://chat.googleapis.com/v1/spaces/XXXXXXXXX/messages?key=YYYYYYY&token=ZZZZZZZ" \
-H "Content-Type: application/json" \
-d '{"text": "Test de conectividad desde Anjana Data"}'
# Slack
curl -X POST https://hooks.slack.com/services/T00000000/B00000000/XXXX \
-H "Content-Type: application/json" \
-d '{"text": "Test de conectividad desde Anjana Data"}'
6.2 Logs relevantes en Hermes
Los servicios registran errores a nivel ERROR cuando falla el envío:
ERROR c.a.h.googlechat.service.GoogleChatService - Error sending message to Google Chat
ERROR c.a.h.slack.service.SlackService - Error sending message to Slack
ERROR c.a.h.teams.service.TeamsService - Error sending message to Teams
ERROR c.a.h.email.service.EmailService - Error sending email notification
6.3 Problemas frecuentes
|
Síntoma |
Causa probable |
Solución |
|---|---|---|
|
No llegan mensajes a Google Chat |
Webhook URL expirada o incorrecta |
Regenerar el webhook en el Space de Google Chat |
|
Error 401 en Slack |
Token revocado |
Recrear la app/webhook en Slack |
|
Teams no recibe mensajes |
Conector Office 365 Connectors deprecado |
Migrar a Power Automate |
|
Timeout en envío |
|
Aumentar el valor (recomendado: 30s) |
|
Campo |
Notificación sin proveedores configurados |
Actualiza en en Panel de administración con los proveedores deseados |
|
Mensajes duplicados |
Pool mal configurado con varios workers |
Revisar |
Equipo de Producto · Anjana Data