Solr定时全量更新索引(不使用solr配置方式)

百度了网上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>

猜你喜欢

转载自blog.csdn.net/jyxmust/article/details/79290403