The culprit seems to be the EmbeddedSolrServer I was using. Apparently you need to shutdown the CoreContainer that it's using for the server to successfully shutdown. What this means is we'll have to modify our search bean a bit. Add the following fields to the class:
private static final SolrServer solrServer = initSolrServer(); private static CoreContainer coreContainer;
The initSolrServer() method looks like this:
private static SolrServer initSolrServer() { try { CoreContainer.Initializer initializer = new CoreContainer.Initializer(); coreContainer = initializer.initialize(); EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, ""); return server; } catch (Exception ex) { logger.log(Level.SEVERE, "Error initializing SOLR server", ex); return null; } }
Finally we'll also add a shutdown method to the search bean:
public static void shutdownSolr() { if (coreContainer != null) { coreContainer.shutdown(); } }
Now all we need to do is call the shutdownSolr() method on our search bean when the servlet container is shut down. For this we'll need to add a ServletContextListener to our web application. Open your web.xml and add the following lines:
<listener> <listener-class>mypackage.SolrListener</listener-class> </listener>
And this is how the SolrListener should look like:
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class SolrListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { SearchBean.shutdownSolr(); } @Override public void contextInitialized(ServletContextEvent arg0) { } }
And now Tomcat should shutdown without any problems!
No comments:
Post a Comment