SrvPOS_Artic · Notas de versión

Notificación de Refresco de Cache a servers remotos

Aviso automático a TsArticulos y TsPromos al completar la generación de precios/novedades.
Fecha: 2026-08-18 Versión: 202608XX Módulo: SrvPOS_Artic Toolchain: Visual C++ 5.0 Binario: SrvPOS_Artic.exe

1 Contexto

El servicio SrvPOS_Artic genera los archivos Btrieve de precios/novedades para los POS (bases dM_Artic = completo y dX_Artic = novedades). Del otro lado hay dos servicios de cache — TsArticulos y TsPromos (plataforma AutoCompra / Autoservicio) — que sirven precios y promociones desde caches en memoria con swap atómico.

Hasta ahora, esos servicios sólo refrescaban su cache por scheduler (cron cada 30 min) o al arrancar. Necesidad: que apenas SrvPOS_Artic termina de generar precios, avise a los servers para que refresquen su cache en el momento, sin esperar al cron.

2 Qué se agregó

Al completar una generación efectiva, el servicio dispara dos POST HTTP (best-effort) vía WinInet:

ServicioMétodoEndpointBodyPuerto
TsArticulos
refresco de cache
POST /articulos/v1/cache/refresh sin body 8082
TsPromos
update de promociones
POST /promos/v1/promociones/update {"datatypes":["MAYORISTA","BULTO"]} 8085

Los datatypes salen de una lista CSV configurable. Vacío = todos (PROMOCION,MAYORISTA,BULTO).

3 Punto de disparo

Se engancha en el cierre de GenerateFiles::GenerateFiles4POS(), dentro del if(iHuboUno) — que se cumple sólo si hubo generación efectiva en la pasada. Una notificación por pasada, no por archivo ni por sucursal.

// SrvPOS_Artic_Novedades.cpp
if(iHuboUno){
    logear(upeINFO,"[NOV] FIN GENERACION ARCHIVOS BTRIEVE-POS\n");
    NotificarRefresh();   // best-effort: avisa a TsArticulos/TsPromos
    }

El loop del servicio es single-thread, así que no hay concurrencia ni locks que cuidar.

4 Configuración — SrvPOS_Artic.ini

Todo por la sección [REFRESHCACHE]. Con HABILITADO=0 ni se intenta. Hosts, puertos, paths, datatypes y timeouts se cambian sin recompilar.

[REFRESHCACHE]
# 1=notifica  0=no hace nada
HABILITADO=0
# --- TsArticulos: POST sin body (responde 202 al instante) ---
ARTICHOST=127.0.0.1
ARTICPORT=8082
ARTICPATH=/articulos/v1/cache/refresh
# --- TsPromos: POST con {"datatypes":[...]} ---
PROMOHOST=127.0.0.1
PROMOPORT=8085
PROMOPATH=/promos/v1/promociones/update
# Lista CSV. Vacio = TODOS. Valores: PROMOCION,MAYORISTA,BULTO
PROMODATATYPES=MAYORISTA,BULTO
# --- Timeouts (ms). Promos /update es sincronico (~5s), por eso read=30s ---
CONNECTTIMEOUTMS=5000
READTIMEOUTMS=30000

5 Comportamiento

A prueba de la generación. Los POST son best-effort: si un server está caído, tira timeout, o devuelve un error, se loguea y sigue. Nunca abortan la generación de precios.

Timeouts

  • Connect corto (5s): si el server no está, falla rápido y no cuelga el ciclo.
  • Articulos /cache/refresh: async — responde 202 en ~400ms.
  • Promos /promociones/update: sincrónico — ~5s normal, puede superar 15s con el server ocupado. Por eso read=30s.

Robustez

  • Los dos POST son independientes: si falla uno, se manda el otro.
  • La respuesta del server se sanitiza (se neutraliza %) antes de loguear, para no romper el printf interno de logear().

Ejemplo de log

[REFRESH][ARTIC] POST 127.0.0.1:8082/articulos/v1/cache/refresh -> HTTP 202 {...}
[REFRESH][PROMO] POST 127.0.0.1:8085/promos/v1/promociones/update -> HTTP 202 {...}

El JSON se arma correcto: {"datatypes":["MAYORISTA","BULTO"]}.

Validación contra servers de prueba (mp.tipre.com, 2026-08-18)

LlamadaResultadoTiempo
POST /articulos/v1/cache/refresh (48082)HTTP 202 STARTED406 ms
POST /promos/v1/promociones/update (48085)HTTP 200 success:true — insertó 264 MAYORISTA + 15 BULTO4750 ms

Probado con el mismo código WinInet del servicio. Confirmó que /promociones/update es sincrónico (de ahí el read de 30s).

6 Cambios de build / compilación

Además de la feature, esta versión dejó el proyecto compilable de forma reproducible:

Ojo VC5: el wininet.h de 1997 no define INTERNET_FLAG_PRAGMA_NOCACHE — no usarlo.

7 Archivos modificados

ArchivoCambio
SrvPOS_Artic_Novedades.cppHook en iHuboUno + funciones NotificarRefresh(), PostRefreshOne(), BuildDatatypesJson(); #include <wininet.h>.
SrvPOS.hGlobals g_Refresh*, filas en la tabla cfgINI (sección REFRESHCACHE) y sus extern.
SrvPOS_Artic.iniNueva sección [REFRESHCACHE].
_btr.cppFix del #include con ruta absoluta rota.
build.batNuevo — build reproducible sin MSDEV.
SrvPOS_Out.dspwininet.lib en el link (ambas configs).

8 Puesta en producción

  1. En SrvPOS_Artic.ini, sección [REFRESHCACHE]: poner HABILITADO=1 y completar los hosts/puertos reales de TsArticulos y TsPromos.
  2. Reiniciar el servicio SrvPOS_Artic.
  3. Verificar en el log las líneas [REFRESH][ARTIC] / [REFRESH][PROMO] tras la próxima generación de precios.

Pendiente: prueba contra los servers reales levantados (el mock ya validó el camino WinInet y el armado del request).