簡體   English   中英

在REST服務(JAX-RS)中保存和更新數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM