[英]Keep and update data in REST service (JAX-RS)
我正在使用jersey(JAX-RS)編寫REST服務。 本質上,它應該執行以下操作:
有一個帶有很多鍵=值對的文本文件。 REST服務的用戶應該能夠查詢密鑰並接收值。
現在,對於每個查詢而言,加載和拆分整個文本文件都花費太長時間。 相反,我想將文本文件加載到Hashmap中,並以固定間隔重新加載它。
我不知道如何實現此行為,以使Hashmap在兩次查詢之間得以生存,並且在重新加載數據時查詢REST服務不會導致並發問題。
我應該怎么做才能在應用程序中擁有這樣的“緩存”?
JAX-RS默認資源生命周期是每個請求的(請求范圍),因此您需要將資源標記為@Singleton
,以使其在並發請求中共享。
@辛格爾頓
javax.inject.Singleton
在這個范圍內,每個jax-rs應用程序只有一個實例。 可以使用@Singleton注釋單例資源,並且可以使用Application實例注冊其類。 您還可以通過將單例實例注冊到Application中來創建單例。
接下來,您需要實現一個定期刷新的線程安全緩存,以存儲您的地圖。
我通常會使用Guava CacheBuilder來做到這一點:
private final LoadingCache<Object,Map<String,String>> cache;
protected final Object CACHE_KEY = new Object();
//Create a Cache and keep it in the instance variable
public MyClass() {
this.cache = CacheBuilder.newBuilder()
.maximumSize(1)
.refreshAfterWrite(10,TimeUnit.MINUTES)
.build(new CacheLoader<Object,Map<String,String>>() {
@Override
public Map<String, String> load(Object key) {
//Parse your file and return a Map<String,String>
}
});
}
@GET
public void doIt() {
//Get a cached copy of your Map
Map<String,String> values = cache.get(CACHE_KEY);
}
可以安全地在多個線程中使用緩存實例(盡管您仍然需要注意從緩存返回的對象的線程安全性),並且它將在10分鍾內自動刷新一次條目。
在更復雜的系統中,您可能還想在其他位置創建LoadingCache
實例,然后將其注入資源類中(在這種情況下,您可以將其限制在請求范圍內)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.