2017-04-21 4 views
0

Ich schreibe einen REST-Service mit Jersey (JAX-RS). Im Wesentlichen sollte es Folgendes tun:Daten im REST-Service (JAX-RS) speichern und aktualisieren

Es gibt eine Textdatei mit vielen Schlüssel = Wert-Paaren. Der Benutzer des REST-Dienstes sollte in der Lage sein, nach einem Schlüssel zu fragen und den Wert zu erhalten.

Jetzt dauert das Laden und Teilen der gesamten Textdatei für jede Abfrage viel zu lange. Stattdessen möchte ich die Textdatei in eine Hashmap laden und in festen Abständen neu laden.

Ich weiß nicht, wie dieses Verhalten implementiert wird, damit die Hashmap zwischen Abfragen überlebt, und das Abfragen des REST-Dienstes beim erneuten Laden der Daten keine Probleme mit dem gemeinsamen Zugriff verursacht.

Was soll ich tun, um einen solchen "Cache" in meiner Anwendung zu haben?

Antwort

1

Der JAX-RS-Standardressourcenlebenszyklus ist pro Request (Request-Bereich). Daher müssen Sie Ihre Ressource stattdessen als @Singleton markieren, damit sie für die gleichzeitigen Anforderungen freigegeben wird.

@Singleton

javax.inject.Singleton

In diesem Bereich gibt es nur eine Instanz pro JAX-RS-Anwendung. Singleton-Ressource kann entweder mit @Singleton kommentiert werden und ihre Klasse kann mit der Instanz von Application registriert werden. Sie können auch Singletons erstellen, indem Sie Singleton-Instanzen in Application registrieren.

Life-cycle of Root Resource Classes

Als nächstes müssen Sie einen periodisch aufgefrischt thread-safe-Cache implementieren, Ihre Karte zu speichern.

ich normalerweise Guava CacheBuilder, dies zu tun:

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); 
} 

Die Cache-Instanz ist sicher über die mehreren Threads zu verwenden (obwohl Sie noch Pflege der Thread-Sicherheit des Sie aus dem Cache zurückkehren Objekt nehmen), und aktualisiert Ihren Eintrag automatisch in 10 Minuten.

In einem komplexeren System möchten Sie vielleicht auch Ihre LoadingCache -Instanz an anderer Stelle erstellen und sie einfach in Ihre Ressourcenklasse einfügen (in diesem Fall könnten Sie den Bereich der Anfrage beibehalten).

Verwandte Themen