Stoaggiornandoun'applicazionewebtomcatesistenteperleggeredeterminaterisorsedaun'APIREST.Attualmentel'applicazionelileggedafileflat.Poichél'applicazioneèmoltocritica,hoaggiuntounlivellodimemorizzazionenellacacheinmodocheglioggettirestituitidall'APIRESTsianosempredisponibili.
NellivellodiserviziodelclientAPI,sel'elementorichiestanonvienetrovatonellacache,larichiestaverràinviataall'APIeffettiva,larispostaverràinseritanellacachediMapDBerestituitaalchiamante.IllistenerdiavviochiamaunsaccodiAPIconparametridiversiinmodochetuttiidatisianooranellacachediMapDB.Nonimpostounascadenzasugliarticolinellacacheperchévogliochesianosempredisponibili,amenochenonsiaggiornisurichiesta.
Ilproblemaèchel'appWebeilclientAPIsonoprogettidiversi.PoichéilclientAPIdecidedileggeredallacacheodall'API,nonsonoingradodiforzareilvaloredellacachediaggiornamentodall'applicazione.
DevoaggiungereunaltroparametropereseguirelechiamatechefaccioalclientAPIo
Objectobj=ServiceFactory.getLanguageService().getLanguagesFromApi(env.getName(),env.getEnvironmentType(),env.getPhase().toString(),null,true);
L'ultimoparametro"true" indica forzare l'aggiornamento della cache.
-
Devo ottenere il valore esistente nella cache su una variabile temporanea, eliminare la voce, effettuare una chiamata API, se non viene restituito alcun valore a causa di un errore, reinserire la voce nella cache.
String key = ClientUtils.concatenateList( Arrays.asList(ClientConstants.RESOURCE_LANGUAGE, env.getName(), env.getEnvironmentType(), env.getPhase(), null), ClientConstants.CACHE_KEY_SEPERATOR, ClientConstants.NULL_STRING); Object cachedElement = ClientCache.getCache().get(key); if (cachedElement != null) { ClientCache.getCache().delete(key); } Object obj = ServiceFactory.getLanguageService() .getLanguagesFromApi(env.getName(), env.getEnvironmentType(), env.getPhase().toString(), null); if (obj == null) { ClientCache.getCache().put(key, cachedElement); }
Qual è il modo più pulito per farlo? Ritengo che l'aggiunta di parametri sulla memorizzazione nella cache per la funzione renda maldestre e aggiunga dipendenze, come getUsers(String country, boolean forceAPIrequest)
. Ma l'eliminazione e l'aggiunta di voci uguali può anche sprecare risorse e spazio heap, causando GC nel tempo. Inoltre, l'App accederà direttamente a Client Cache per eseguire queste operazioni.
Tutto questo si basa sul strong presupposto che la nostra API REST non sia affidabile. L'app Web non dovrebbe avere tempi di inattività.