VClassGroupCache now updates when search index is changed NIHVIVO-3455 NIHVIVO-3458
This commit is contained in:
parent
52c3838b44
commit
d8615fd1f5
2 changed files with 73 additions and 10 deletions
|
@ -41,6 +41,8 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
|
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.VitroSearchTermNames;
|
import edu.cornell.mannlib.vitro.webapp.search.VitroSearchTermNames;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch;
|
import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexingEventListener;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup;
|
import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup;
|
||||||
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
|
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
|
||||||
import edu.cornell.mannlib.vitro.webapp.utils.threads.VitroBackgroundThread;
|
import edu.cornell.mannlib.vitro.webapp.utils.threads.VitroBackgroundThread;
|
||||||
|
@ -52,7 +54,7 @@ import edu.cornell.mannlib.vitro.webapp.utils.threads.VitroBackgroundThread;
|
||||||
* As of VIVO release 1.4, the counts come from the solr index. Before that they
|
* As of VIVO release 1.4, the counts come from the solr index. Before that they
|
||||||
* came from the DAOs.
|
* came from the DAOs.
|
||||||
*/
|
*/
|
||||||
public class VClassGroupCache {
|
public class VClassGroupCache implements IndexingEventListener {
|
||||||
private static final Log log = LogFactory.getLog(VClassGroupCache.class);
|
private static final Log log = LogFactory.getLog(VClassGroupCache.class);
|
||||||
|
|
||||||
private static final String ATTRIBUTE_NAME = "VClassGroupCache";
|
private static final String ATTRIBUTE_NAME = "VClassGroupCache";
|
||||||
|
@ -453,6 +455,10 @@ public class VClassGroupCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ****************** Jena Model Change Listener***************************** */
|
/* ****************** Jena Model Change Listener***************************** */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen for changes to what class group classes are in and their display rank.
|
||||||
|
*/
|
||||||
protected class VClassGroupCacheChangeListener extends StatementListener {
|
protected class VClassGroupCacheChangeListener extends StatementListener {
|
||||||
public void addedStatement(Statement stmt) {
|
public void addedStatement(Statement stmt) {
|
||||||
checkAndDoUpdate(stmt);
|
checkAndDoUpdate(stmt);
|
||||||
|
@ -488,11 +494,15 @@ public class VClassGroupCache {
|
||||||
public static class Setup implements ServletContextListener {
|
public static class Setup implements ServletContextListener {
|
||||||
@Override
|
@Override
|
||||||
public void contextInitialized(ServletContextEvent sce) {
|
public void contextInitialized(ServletContextEvent sce) {
|
||||||
ServletContext servletContext = sce.getServletContext();
|
ServletContext context = sce.getServletContext();
|
||||||
VClassGroupCache vcgc = new VClassGroupCache(servletContext);
|
VClassGroupCache vcgc = new VClassGroupCache(context);
|
||||||
vcgc.requestCacheUpdate();
|
vcgc.requestCacheUpdate();
|
||||||
servletContext.setAttribute(ATTRIBUTE_NAME,vcgc);
|
context.setAttribute(ATTRIBUTE_NAME,vcgc);
|
||||||
log.info("VClassGroupCache added to context");
|
log.info("VClassGroupCache added to context");
|
||||||
|
|
||||||
|
IndexBuilder indexBuilder = IndexBuilder.getBuilder(context);
|
||||||
|
indexBuilder.addIndexBuilderListener(vcgc);
|
||||||
|
log.info("VClassGroupCache set to listen to events from IndexBuilder");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -512,4 +522,22 @@ public class VClassGroupCache {
|
||||||
return (VClassGroupCache) sc.getAttribute(ATTRIBUTE_NAME);
|
return (VClassGroupCache) sc.getAttribute(ATTRIBUTE_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle notification of events from the IndexBuilder.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void notifyOfIndexingEvent(EventTypes event) {
|
||||||
|
switch( event ){
|
||||||
|
case FINISH_FULL_REBUILD:
|
||||||
|
case FINISHED_UPDATE:
|
||||||
|
log.debug("rebuilding because of IndexBuilder " + event.name());
|
||||||
|
requestCacheUpdate();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log.debug("ignoring event type " + event.name());
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
|
||||||
|
@ -73,6 +74,10 @@ public class IndexBuilder extends VitroBackgroundThread {
|
||||||
/** Number of threads to use during indexing. */
|
/** Number of threads to use during indexing. */
|
||||||
protected int numberOfThreads = 10;
|
protected int numberOfThreads = 10;
|
||||||
|
|
||||||
|
/** List of IndexingEventListeners */
|
||||||
|
protected LinkedList<IndexingEventListener> indexingEventListeners =
|
||||||
|
new LinkedList<IndexingEventListener>();
|
||||||
|
|
||||||
public static final int MAX_REINDEX_THREADS= 10;
|
public static final int MAX_REINDEX_THREADS= 10;
|
||||||
public static final int MAX_UPDATE_THREADS= 10;
|
public static final int MAX_UPDATE_THREADS= 10;
|
||||||
public static final int MAX_THREADS = Math.max( MAX_UPDATE_THREADS, MAX_REINDEX_THREADS);
|
public static final int MAX_THREADS = Math.max( MAX_UPDATE_THREADS, MAX_REINDEX_THREADS);
|
||||||
|
@ -143,6 +148,14 @@ public class IndexBuilder extends VitroBackgroundThread {
|
||||||
this.notifyAll();
|
this.notifyAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for indexing events. Methods on listener will be called when
|
||||||
|
* events happen in the IndexBuilder. This is not a Jena ModelListener.
|
||||||
|
*/
|
||||||
|
public synchronized void addIndexBuilderListener(IndexingEventListener listener){
|
||||||
|
indexingEventListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is called when the system shuts down.
|
* This is called when the system shuts down.
|
||||||
*/
|
*/
|
||||||
|
@ -159,13 +172,22 @@ public class IndexBuilder extends VitroBackgroundThread {
|
||||||
if( reindexRequested ){
|
if( reindexRequested ){
|
||||||
setWorkLevel(WorkLevel.WORKING, FLAG_REBUILDING);
|
setWorkLevel(WorkLevel.WORKING, FLAG_REBUILDING);
|
||||||
log.debug("full re-index requested");
|
log.debug("full re-index requested");
|
||||||
|
|
||||||
|
notifyListeners( IndexingEventListener.EventTypes.START_FULL_REBUILD );
|
||||||
indexRebuild();
|
indexRebuild();
|
||||||
|
notifyListeners( IndexingEventListener.EventTypes.FINISH_FULL_REBUILD );
|
||||||
|
|
||||||
setWorkLevel(WorkLevel.IDLE);
|
setWorkLevel(WorkLevel.IDLE);
|
||||||
}else if( !changedStmtQueue.isEmpty() ){
|
}else if( !changedStmtQueue.isEmpty() ){
|
||||||
setWorkLevel(WorkLevel.WORKING, FLAG_UPDATING);
|
setWorkLevel(WorkLevel.WORKING, FLAG_UPDATING);
|
||||||
Thread.sleep(WAIT_AFTER_NEW_WORK_INTERVAL); //wait a bit to let a bit more work to come into the queue
|
|
||||||
|
//wait a bit to let a bit more work to come into the queue
|
||||||
|
Thread.sleep(WAIT_AFTER_NEW_WORK_INTERVAL);
|
||||||
log.debug("work found for IndexBuilder, starting update");
|
log.debug("work found for IndexBuilder, starting update");
|
||||||
|
|
||||||
|
notifyListeners( IndexingEventListener.EventTypes.START_UPDATE );
|
||||||
updatedIndex();
|
updatedIndex();
|
||||||
|
notifyListeners( IndexingEventListener.EventTypes.FINISHED_UPDATE );
|
||||||
setWorkLevel(WorkLevel.IDLE);
|
setWorkLevel(WorkLevel.IDLE);
|
||||||
} else {
|
} else {
|
||||||
log.debug("there is no indexing working to do, waiting for work");
|
log.debug("there is no indexing working to do, waiting for work");
|
||||||
|
@ -180,6 +202,8 @@ public class IndexBuilder extends VitroBackgroundThread {
|
||||||
|
|
||||||
if( indexer != null)
|
if( indexer != null)
|
||||||
indexer.abortIndexingAndCleanUp();
|
indexer.abortIndexingAndCleanUp();
|
||||||
|
|
||||||
|
notifyListeners( IndexingEventListener.EventTypes.SHUTDOWN );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -440,5 +464,16 @@ public class IndexBuilder extends VitroBackgroundThread {
|
||||||
private final List<String> updatedUris = new ArrayList<String>();
|
private final List<String> updatedUris = new ArrayList<String>();
|
||||||
private final List<String> deletedUris = new ArrayList<String>();
|
private final List<String> deletedUris = new ArrayList<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void notifyListeners(IndexingEventListener.EventTypes event){
|
||||||
|
for ( IndexingEventListener listener : indexingEventListeners ){
|
||||||
|
try{
|
||||||
|
if(listener != null )
|
||||||
|
listener.notifyOfIndexingEvent( event );
|
||||||
|
}catch(Throwable th){
|
||||||
|
log.error("problem during NotifyListeners(): " , th);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue