百度了网上solr全量更新,基本都是使用solr配置方式,博客都写的差不多。。。而且特别麻烦,要这个jar包那个jar包。想到定时,其实使用Spring与Quartz的整合实现定时任务调度,定时去调用方法,然后在方法里实现solr的全量更新索引就行,实现起来简单,代码如下:
/**
* Created by jyx on 2018/2/7.
*/
@Component
public class MyproductSearchIndex{
@Resource(name = "httpSolrClient")
private SolrClient solrClient;
private static final Logger LOGGER = LoggerFactory.getLogger(MyproductSearchIndex.class);
public void run(){
try{
SolrRequest<QueryResponse> request = buildRequest(Command.FULL_IMPORT, "ProductInfo");
request.setPath("/dataimport");
NamedList<Object> resp = solrClient.request(request, "product");
LOGGER.info("product 重建索引成功,具体结果:" + resp.toString());
}catch (Exception e){
LOGGER.info("product 重建索引成功,异常信息:" + e.getMessage());
e.printStackTrace();
}
}
public SolrRequest<QueryResponse> buildRequest(Command command, String entity){
Map<String, String> map = new HashMap<>();
switch (command){
case DELTA_IMPORT:
map.put("command", "delta-import");
map.put("clean", "false");
map.put("commit", "true");
map.put("optimize", "false");
map.put("index", "false");
map.put("entity", entity);
map.put("debug", "false");
map.put("wt", "json");
return new QueryRequest(new MapSolrParams(map));
case FULL_IMPORT:
map.put("command", "full-import");
map.put("clean", "true");
map.put("commit", "true");
map.put("optimize", "false");
map.put("entity", entity);
map.put("index", "false");
map.put("debug", "false");
map.put("wt", "json");
return new QueryRequest(new MapSolrParams(map));
}
return null;
}
}
Spring与Quartz的整合实现
<!-- 要调用的工作类-->
<bean id="myproductSearchIndex" class="com.yaochufa.middle.jobtask.MyproductSearchIndex"></bean>
<bean id="jobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject" ref="myproductSearchIndex"/>
<!-- 调用类中的方法 -->
<property name="targetMethod" value="run"/>
<!--表示不并发操作-->
<property name="concurrent" value="false"/>
</bean>
<!-- 配置定时器时间间隔 -->
<!-- 定义时间间隔触发器 */10 * * * * ?表示每隔10秒执行一次-->
<bean id="jobTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
p:jobDetail-ref="jobTask" p:cronExpression="*/10 * * * * ?"/>
<!--配置启动定时器-->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="triggers">
<list>
<ref bean="jobTaskTrigger" />
</list>
</property>
</bean>