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.
Al completar una generación efectiva, el servicio dispara dos POST HTTP (best-effort) vía WinInet:
| Servicio | Método | Endpoint | Body | Puerto |
|---|---|---|---|---|
| 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).
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.
SrvPOS_Artic.iniTodo 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
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.
/cache/refresh: async — responde 202 en ~400ms./promociones/update: sincrónico — ~5s normal, puede superar 15s
con el server ocupado. Por eso read=30s.%) antes de loguear,
para no romper el printf interno de logear().[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"]}.
| Llamada | Resultado | Tiempo |
|---|---|---|
POST /articulos/v1/cache/refresh (48082) | HTTP 202 STARTED | 406 ms |
POST /promos/v1/promociones/update (48085) | HTTP 200 success:true — insertó 264 MAYORISTA + 15 BULTO | 4750 ms |
Probado con el mismo código WinInet del servicio. Confirmó que
/promociones/update es sincrónico (de ahí el read de 30s).
Además de la feature, esta versión dejó el proyecto compilable de forma reproducible:
_btr.cpp: la ruta absoluta
c:\work\tiprelibs\_common.h (que sólo existía en una máquina) pasó a relativa
TipreLibs\_common.h. Ahora banca un rebuild completo.build.bat: build headless con cl/link de VC5,
sin depender de MSDEV (que en modo batch se cuelga en un diálogo modal). Genera un binario
idéntico al de un F7. Uso: build.bat o build.bat clean.wininet.lib agregado al link (en build.bat y en
SrvPOS_Out.dsp).Ojo VC5: el wininet.h de 1997 no define
INTERNET_FLAG_PRAGMA_NOCACHE — no usarlo.
| Archivo | Cambio |
|---|---|
SrvPOS_Artic_Novedades.cpp | Hook en iHuboUno + funciones NotificarRefresh(), PostRefreshOne(), BuildDatatypesJson(); #include <wininet.h>. |
SrvPOS.h | Globals g_Refresh*, filas en la tabla cfgINI (sección REFRESHCACHE) y sus extern. |
SrvPOS_Artic.ini | Nueva sección [REFRESHCACHE]. |
_btr.cpp | Fix del #include con ruta absoluta rota. |
build.bat | Nuevo — build reproducible sin MSDEV. |
SrvPOS_Out.dsp | wininet.lib en el link (ambas configs). |
SrvPOS_Artic.ini, sección [REFRESHCACHE]: poner
HABILITADO=1 y completar los hosts/puertos reales de TsArticulos y TsPromos.[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).