mirror of https://github.com/apache/lucene.git
SOLR-423: Add CloseHook notification
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@671960 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
81d4040cff
commit
a0983feb04
|
@ -296,6 +296,8 @@ New Features
|
|||
Also includes ability to add your own SolrSpellChecker implementation that plugs in.
|
||||
See http://wiki.apache.org/solr/SpellCheckComponent for more details
|
||||
(Shalin Shekhar Mangar, Bojan Smid, gsingers)
|
||||
|
||||
54. SOLR-423: Added Request Handler close hook notification so that RequestHandlers can be notified when a core is closing. (gsingers, ryan)
|
||||
|
||||
Changes in runtime behavior
|
||||
1. SOLR-559: use Lucene updateDocument, deleteDocuments methods. This
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package org.apache.solr.core;
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Interface to request notification when the core is closed.
|
||||
*<p/>
|
||||
* Call {@link org.apache.solr.core.SolrCore#addCloseHook(org.apache.solr.core.CloseHook)} during the {@link org.apache.solr.util.plugin.SolrCoreAware#inform(SolrCore)} method to
|
||||
* add a close hook to your object.
|
||||
* <p/>
|
||||
* The close hook can be useful for releasing objects related to the request handler (for instance, if you have a JDBC DataSource or something like that)
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
public interface CloseHook {
|
||||
void close( SolrCore core );
|
||||
}
|
|
@ -452,8 +452,14 @@ public final class SolrCore {
|
|||
return factory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close all resources allocated by the core.
|
||||
* 1. searcher
|
||||
* 2. updateHandler
|
||||
* 3. all CloseHooks will be notified
|
||||
*/
|
||||
public void close() {
|
||||
log.info(logid+"CLOSING SolrCore!");
|
||||
log.info(logid+" CLOSING SolrCore!");
|
||||
try {
|
||||
closeSearcher();
|
||||
} catch (Exception e) {
|
||||
|
@ -469,6 +475,11 @@ public final class SolrCore {
|
|||
} catch (Exception e) {
|
||||
SolrException.log(log,e);
|
||||
}
|
||||
if( closeHooks != null ) {
|
||||
for( CloseHook hook : closeHooks ) {
|
||||
hook.close( this );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isClosed() {
|
||||
|
@ -478,6 +489,19 @@ public final class SolrCore {
|
|||
@Override
|
||||
protected void finalize() { close(); }
|
||||
|
||||
private List<CloseHook> closeHooks = null;
|
||||
|
||||
/**
|
||||
* Add a close callback hook
|
||||
*/
|
||||
public void addCloseHook( CloseHook hook )
|
||||
{
|
||||
if( closeHooks == null ) {
|
||||
closeHooks = new ArrayList<CloseHook>();
|
||||
}
|
||||
closeHooks.add( hook );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a Request object based on the admin/pingQuery section
|
||||
* of the Solr config file.
|
||||
|
|
|
@ -22,6 +22,7 @@ import org.apache.solr.request.SolrQueryRequest;
|
|||
import org.apache.solr.request.SolrQueryResponse;
|
||||
import org.apache.solr.request.SolrRequestHandler;
|
||||
import org.apache.solr.util.AbstractSolrTestCase;
|
||||
import org.apache.solr.util.plugin.SolrCoreAware;
|
||||
|
||||
public class SolrCoreTest extends AbstractSolrTestCase {
|
||||
|
||||
|
@ -34,17 +35,42 @@ public class SolrCoreTest extends AbstractSolrTestCase {
|
|||
|
||||
EmptyRequestHandler handler1 = new EmptyRequestHandler();
|
||||
EmptyRequestHandler handler2 = new EmptyRequestHandler();
|
||||
|
||||
|
||||
String path = "/this/is A path /that won't be registered!";
|
||||
SolrRequestHandler old = core.registerRequestHandler( path, handler1 );
|
||||
assertNull( old ); // should not be anything...
|
||||
assertEquals( core.getRequestHandlers().get( path ), handler1 );
|
||||
assertEquals( core.getRequestHandlers().get( path ), handler1 );
|
||||
old = core.registerRequestHandler( path, handler2 );
|
||||
assertEquals( old, handler1 ); // should pop out the old one
|
||||
assertEquals( core.getRequestHandlers().get( path ), handler2 );
|
||||
assertEquals( core.getRequestHandlers().get( path ), handler2 );
|
||||
}
|
||||
|
||||
public void testClose() throws Exception {
|
||||
SolrCore core = h.getCore();
|
||||
|
||||
ClosingRequestHandler handler1 = new ClosingRequestHandler();
|
||||
handler1.inform( core );
|
||||
|
||||
String path = "/this/is A path /that won't be registered!";
|
||||
SolrRequestHandler old = core.registerRequestHandler( path, handler1 );
|
||||
assertNull( old ); // should not be anything...
|
||||
assertEquals( core.getRequestHandlers().get( path ), handler1 );
|
||||
core.close();
|
||||
assertTrue("Handler not closed", handler1.closed == true);
|
||||
}
|
||||
}
|
||||
|
||||
class ClosingRequestHandler extends EmptyRequestHandler implements SolrCoreAware {
|
||||
boolean closed = false;
|
||||
|
||||
public void inform(SolrCore core) {
|
||||
core.addCloseHook( new CloseHook() {
|
||||
public void close(SolrCore core) {
|
||||
closed = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An empty handler for testing
|
||||
|
@ -55,9 +81,9 @@ class EmptyRequestHandler extends RequestHandlerBase
|
|||
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
|
||||
// nothing!
|
||||
}
|
||||
|
||||
|
||||
@Override public String getDescription() { return null; }
|
||||
@Override public String getSource() { return null; }
|
||||
@Override public String getSourceId() { return null; }
|
||||
@Override public String getVersion() { return null; }
|
||||
@Override public String getVersion() { return null; }
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue