Я использую кеш кофеина в своем приложении для хранения результатов некоторых запросов от внешнего API. Я решил, что было бы разумно использовать синглтон, так что это будет всего один кэш во всем приложении. Во-вторых, он внедряет bean-компонент без сохранения состояния и службу запросов API. Этот кэш, скорее всего, будет иметь высокий трафик c
Может ли эта реализация каким-то образом быть bottle шейной, и, возможно, есть лучший способ связать ее?
Будет ли синглтон использовать только один экземпляр внедренного сервиса (ответ занимает около 3 с, поэтому я хочу использовать многопоточность с кофеином при обновлении значений)? Если это плохая картина, как я должен решить это?
- Должна ли служба вызовов API быть локальным компонентом без сохранения состояния?
@Startup
@Singleton
class MyResultsCache {
@EJB
protected RestApiCallService service;
protected Caffeine<Object, Object> cacheBuilder = Caffeine.newBuilder()
.refreshAfterWrite(REFRESH_AFTER_MINUTES, TimeUnit.MINUTES)
.expireAfterWrite(EXPIRE_AFTER_DAYS, TimeUnit.DAYS);
protected LoadingCache<Object, Object> cache;
@PostConstruct
public void init() {
loader = service::doRequestToApi;
cache = cacheBuilder.build(loader);
}
}
@Stateless
@LocalBean
class RestApiCallService {
private WebTarget target = ...; // web target creation here also
public Object doRequestToApi(Object reqObj) {
// amazing request impl...
return target.request(..)post(..);
}
}