solr本身就提供了一个工具库实现定时增量索引,但是我在使用的过程中发现会出现一些问题,目前遇到两点:
1.启动时总是报如下异常:
1
|
The web application [solr] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. |
尝试修改源码,不通过SolrResourceLoader加载配置文件,修改完成部署后,可以正常启动。
2.正常启动后,定时发起任务时,报如下异常:
1
|
415 Unsupported Media Type |
查看BaseTimerTask类,发现在发送http请求的地方,没有在请求头中加入Content-Type。修改之后问题解决。
代码具体修改如下,完整源码会在最后提供下载地址:
ApplicationListener类:
1
2
3
4
5
6
7
8
9
10
|
@Override public void contextInitialized(ServletContextEvent servletContextEvent) { ... Timer timer = new Timer(); HttpPostScheduler task = new HttpPostScheduler( servletContext.getServletContextName(), servletContext.getInitParameter( "autoDeltaImportConfPath" ), timer); ... } |
SolrDataImportProperties类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
... private String autoDeltaImportConfPath; public SolrDataImportProperties() { } public SolrDataImportProperties(String autoDeltaImportConfPath) { this .autoDeltaImportConfPath = autoDeltaImportConfPath; } ... public void loadProperties( boolean force) { try { if (force || properties == null ) { properties = new Properties(); File dataImportProperties = new File(autoDeltaImportConfPath, "dataimport.properties" ); ... } |
HttpPostScheduler类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public HttpPostScheduler(String webAppName, String autoDeltaImportConfPath, Timer t) throws Exception{ ... //load properties from global dataimport.properties p = new SolrDataImportProperties(autoDeltaImportConfPath); ... } ... private void sendHttpPost(String completeUrl, String coreName){ ... URL url = new URL(completeUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod( "POST" ); conn.setRequestProperty( "type" , "submit" ); conn.setRequestProperty( "Content-Type" , "*/*" ); //新增 conn.setDoOutput( true ); ... } |
web.xml文件:
1
2
3
4
5
6
7
|
< context-param > < param-name >autoDeltaImportConfPath</ param-name > < param-value >/yourconfpath</ param-value > </ context-param > < listener > < listener-class >org.apache.solr.handler.dataimport.scheduler.ApplicationListener</ listener-class > </ listener > |
另外说明一点,现在的dataimport.properties可以随意放,只需在上面指定位置即可。
源码托管在Git osc了,地址是http://git.oschina.net/ywooer/solr-dataimporthandler-scheduler.git
参考文档:
官方文档,http://wiki.apache.org/solr/DataImportHandler#Scheduling
官方工具库:http://code.google.com/p/solr-data-import-scheduler/
另外有一个第三方实现支持重建索引:https://code.google.com/p/solr-dataimport-scheduler/