2013-11-22 17 views
5

Abbiamo uno strato REST e il backend come implementazione Jackrabbit. Abbiamo utilizzato TransientRepository con le impostazioni predefinite. Quando due richieste (solo per la lettura dei nodi) vengono sparati, allo stesso tempo, ci troviamo di fronte con il seguente errore:Blocco repository Jackrabbit per accesso simultaneo

:. RepositoryLock.acquire (134) :: file di blocco {} Tomcat esistente/LOCK rilevato. Il repository non è stato chiuso correttamente. javax.jcr.RepositoryException: Il repository home {tomcat} sembra essere in uso poiché il file denominato .lock è già bloccato dal processo corrente.

La pagina wiki di jackrabbit: http://wiki.apache.org/jackrabbit/RepositoryLock indica che ciò accade quando il repository è già aperto nello stesso processo ma all'interno di un altro caricatore di classi (ad esempio, in un'altra applicazione Web). In questo caso è necessario assicurarsi che il repository sia chiuso quando l'applicazione web viene interrotta.

Abbiamo usato sotto il codice per ottenere repository e la creazione di sessioni:

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

Il codice di cui sopra è per ciascuna delle operazioni di Jackrabbit, quindi la sessione viene chiusa dopo ogni operazione. E c'è solo una applicazione web che accede al repository di Jackrabbit.

La soluzione fornita nella pagina RepositoryLock suggerisce di utilizzare il server repository. È l'unica soluzione qui o mi manca qualcosa nella configurazione o durante la codifica?

risposta

1

Forse si dovrebbe utilizzare il metodo

loggedOut (sessione SessionImpl) Rimuove la sessione data dalla serie di sessioni aperte. specifico per questa repository o utilizzare un server di repository in un listener di applicazioni e averlo accessibile tramite JNDI in modo da poterlo avviare/arrestare in modo pulito?

+0

Grazie per aver risposto alla domanda. Ho provato a utilizzare il metodo TransientRepository.loggedOut (sessionImpl) e a verificarlo eseguendo due richieste contemporaneamente, ma viene comunque restituita l'eccezione RepositoryLock. Valuterò l'altra opzione di avere un server di repository, ma lo scenario di thread simultanei sembra abbastanza comune a causa del quale mi chiedevo se c'è qualche configurazione che mi manca. – averagejoe

Problemi correlati