Вы можете использовать Pipe и Map вложенные значения
this.AlvosService.getContas(this.identific, this.search)
.pipe(
switchMap((accounts) => accounts.map((account) => account.data))
)
.subscribe((customers) => { console.log(customers) }),
(error) => { console.log(error); }
Примечание: лучше не использовать переменные, начинающиеся с заглавных букв, так как в AlvosService , что является плохой практикой
Ваш вопрос содержит несколько отдельных вопросов вместе. Давайте медленно запускаться. ServletContext является хорошим местом, где можно сохранить дескриптор к кэшу. Но Вы платите при наличии кэша на экземпляр сервера. Это не должна быть без проблем. Если Вы хотите зарегистрироваться, кэш в более широком диапазоне рассматривают регистрацию его в JNDI.
Проблема с кэшированием. В основном Вы получаете xml через веб-сервис. Если Вы получаете доступ к этому веб-сервису через HTTP, можно установить простой сервер Прокси HTTP на стороне, которые обрабатывают кэширование xml. Следующий шаг будет кэшироваться разрешенного xml в своего рода кэше локального объекта. Этот кэш может существовать на сервер без любой проблемы. В этом втором случае EHCache сделает идеальное задание. В этом случае цепочка обработки будет похожа на это Client - http request -> servlet -> look into local cache - if not cached -> look into http proxy (xml files) -> do proxy job (http to webservice)
.
Профессионалы:
Недостатки:
Обновление: не забывайте всегда отправлять запрос ГОЛОВЫ HTTP в прокси, чтобы гарантировать, что кэш актуален.
Вот пример кэширования с EhCache. Этот код используется в нескольких проектах реализовать для данного случая кэширование.
1) Поместите свой кэш в глобальный контекст. (Не забывайте добавлять слушателя в WEB.XML).
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
public class InitializationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext ctx = sce.getServletContext();
CacheManager singletonManager = CacheManager.create();
Cache memoryOnlyCache = new Cache("dbCache", 100, false, true, 86400,86400);
singletonManager.addCache(memoryOnlyCache);
cache = singletonManager.getCache("dbCache");
ctx.setAttribute("dbCache", cache );
}
}
2) Получите экземпляр кэша при необходимости в нем. т.е. от сервлета:
cache = (Cache) this.getContext().getAttribute("dbCache");
3) Запросите кэш непосредственно перед тем, как Вы делаете дорогую операцию.
Element e = getCache().get(key);
if (e != null) {
result = e.getObjectValue(); // get object from cache
} else {
// Write code to create the object you need to cache, then store it in the cache.
Element resultCacheElement = new Element(key, result);
cache.put(resultCacheElement);
}
4) Также не забывайте делать недействительным кэшируемые объекты в надлежащих случаях.
Можно найти больше образцов здесь
Опция № 1: пользуйтесь библиотекой кэширования открытого исходного кода, такой как EHCache
Не реализуйте свой собственный кэш, когда существует много хороших альтернатив с открытым исходным кодом, которым можно заглядывать и начать использовать. Реализация Вашего собственного кэша намного более сложна, чем большинство людей понимает и если Вы не будете знать точно, что Вы делаете wrt поточная обработка, то Вы легко начнете изобретать велосипед и разрешать некоторые очень трудные проблемы.
Я рекомендовал бы EHCache, он находится под лицензией Apache. Вы захотите смотреть на примеры кода EHCace.
Опция № 2: используйте сквид
Еще более легкое решение Вашей проблемы состояло бы в том, чтобы использовать Сквид... Поместите Сквид, промежуточный процесс, который запрашивает данные, которые будут кэшироваться и система, выполняющая запрос: http://www.squid-cache.org/
После выполнения еще некоторого оглядывания меня кажется, что самый легкий способ достигнуть, в чем я нуждаюсь (в требованиях и приемлемых ограничениях, описанных в вопросе), состоял бы в том, чтобы добавить мой объект кэширования к Контексту Сервлета и поиск он (или раздавание его) при необходимости.
Я просто инстанцировал бы своего загрузчика конфигурации от ServletContextListener, и в contextInitialized () метод, я просто сохраню его в ServletContext с помощью ServletContext.setAttribute (). Затем легко искать его от самих сервлетов с помощью request.getSession () .getServletContext () .getAttribute ().
Я предполагаю, что это - надлежащий способ сделать это, не представляя пружину или любую другую платформу внедрения зависимости.