Billy Newman skrev:
I have deployed the solr.war to my application server.  On deploy I
can see the solr server and my core "general" start up.

I have a timer that fires every so ofter to go out and 'crawl' some
services and index into Solr.  I am using Solrj in my application and
I am having trouble understanding the best way to get data in my
already running Solr Server.

I am trying to use the EmbeddedSolrServer to connect to the "general"
core that is already running:

String solrHomeProperty = System.getProperty("solr.solr.home");
File solrHome = new File(solrHomeProperty);
CoreContainer coreContainer = new CoreContainer(solrHomeProperty);
coreContainer.load(solrHomeProperty, new File(solrHome, "solr.xml"));
SolrServer solrServer = new EmbeddedSolrServer(coreContainer, "general");

The problem here is that I think this is trying to start a new Solr
server, and it collides with the Solr server that is already running,
as I get the following exception:

SEVERE [org.apache.solr.core.CoreContainer] Unable to create core: general
java.nio.channles.OverlappingFileLockException
...
You create a new CoreContainer and it will create and start the SolrCores described in your solr.xml. But they are already running. You dont want to create a new CoreContainer but look up the existing one instead, and use that for your EmbeddedSolrServer. The CoreContainer is available through SolrDispatchFilter.getCores, so basically you need to get hold of the SolrDispatchFilter instance.

You do not say much about where/how your "other code" (the code with you timer job) runs. Is it in the same webapp as Solr (you might have hacked the web.xml of Solr), is it another webapp running side by side with the solr-webapp in the same webcontainer, is it a ejb-app or what is it. Depending on where/how your "other code" runs there are different ways to get hold of the SolrDispatchFilter. You can probably get it through JNDI but in some containers this means that you need to do some JNDI-name-wireing between your apps. There are other "easier" ways depending on where/how your "other code" runs - I believe you want to google for things like ServletContext, getRequestDispatcher, getNamedDispatcher etc. You might also have to consider the actual container you are using (for Solr its Jetty out-of-the-box, but you might run on tomcat or something else), even though I believe the specs allow you to do what you want - and if the spec dictates a way, all webcontainers (that want to be certified) have to support it.

Hope it helps you. Else I might get time to help you in a little more concrete way. Have been teaching webapp and ejb-app stuff many years ago, so I might be able to dust off my knowledge about it in order to help you.

I know that I can also use HttpSolrServer, but I don't really want to
connect Http when I am already in  the application server.

What is the suggested way to connect to an already running solr server
using Solrj.  Am I using EmbeddedSolrServer wrong, or is it expected
behavior for it to try and start a new server?

Thanks in advance!!!


Reply via email to