2013-11-22 18 views
5

Wir haben eine REST-Schicht und ein Backend als Jackrabbit-Implementierung. Wir haben TransientRepository mit den Standardeinstellungen verwendet. Wenn zwei Anforderungen (nur zum Lesen der Knoten) zur gleichen Zeit ausgelöst werden, sehen wir uns mit dem folgenden Fehler konfrontiert:Jackrabbit-Repository-Sperre für gleichzeitigen Zugriff

: RepositoryLock.acquire (134) Das Repository wurde nicht ordnungsgemäß heruntergefahren. javax.jcr.RepositoryException: Das Repository home {tomcat} wird anscheinend verwendet, da die Datei mit dem Namen .lock bereits vom aktuellen Prozess gesperrt ist.

Die Jackrabbit-Wiki-Seite: http://wiki.apache.org/jackrabbit/RepositoryLock erwähnt, dass dies geschieht, wenn das Repository bereits im selben Prozess geöffnet ist, aber innerhalb eines anderen Klassenladeprogramms (z. B. in einer anderen Webanwendung). In diesem Fall müssen Sie sicherstellen, dass das Repository geschlossen ist, wenn die Webanwendung gestoppt wird.

Wir Code unten haben für das Erhalten Repository und die Schaffung von Sitzungen verwendet:

try { 
Repository repository = new TransientRepository(REPO_CONFIG_FILE, REPO_HOME_DIR); 
session = repository.login(new SimpleCredentials(REPOSITORY_USERNAME, REPOSITORY_PASSWORD.toCharArray())); 
} finally { 
    if(session != null){ 
     session.logout(); 
    } 
} 

Der obige Code ist für jede der Operationen von hase, so dass die Sitzung nach jeder Operation geschlossen wird. Und es gibt nur eine Webanwendung, die auf dieses Jackrabbit-Repository zugreift.

Die auf der RepositoryLock-Seite angegebene Lösung schlägt vor, Repository Server zu verwenden. Ist das die einzige Lösung hier oder mir fehlt etwas in der Konfiguration oder beim Codieren?

Antwort

1

Vielleicht sollten Sie die Methode verwenden

LoggedOut (SessionImpl Sitzung) Entfernt den gegebenen Sitzung aus dem Satz von offenen Sitzungen. Welche ist spezifisch für dieses Repository oder verwenden Sie einen Repository Server in einem Application-Listener und haben Sie Zugriff über JNDI, so dass Sie es sauber starten/stoppen konnten?

+0

Vielen Dank für die Beantwortung der Frage. Ich habe versucht, die TransientRepository.loggedOut (sessionImpl) -Methode zu verwenden und sie zu testen, indem ich zwei Anforderungen gleichzeitig trage, aber es gibt immer noch die RepositoryLock-Ausnahme. Ich werde die andere Option eines Repository-Servers auswerten, aber das Szenario mit gleichzeitigen Threads scheint ziemlich häufig zu sein, aufgrund dessen ich mich gefragt habe, ob es irgendeine Konfiguration gibt, die ich vermisse. – averagejoe