All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.jnoee.xo.jpa.search.index.EntityIndexManager Maven / Gradle / Ivy

package com.github.jnoee.xo.jpa.search.index;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.Metamodel;

import org.hibernate.CacheMode;
import org.hibernate.search.MassIndexer;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.Search;
import org.springframework.beans.factory.annotation.Autowired;

import com.github.jnoee.xo.exception.SysException;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * 实体全文索引管理组件。
 */
@Slf4j
public class EntityIndexManager {
  @Autowired
  private EntityManagerFactory entityManagerFactory;
  @Getter
  private List> indexedEntityClasses = new ArrayList<>();

  /**
   * 初始化方法。
   */
  @PostConstruct
  public void init() {
    Metamodel metamodel = entityManagerFactory.getMetamodel();
    for (EntityType entry : metamodel.getEntities()) {
      Class entityClass = entry.getJavaType();
      if (entityClass.isAnnotationPresent(Indexed.class)) {
        indexedEntityClasses.add(entityClass);
      }
    }
  }

  /**
   * 同步创建指定实体类的全文索引,如果未指定实体类则创建全部实体类的全文索引。
   * 
   * @param entityClasses 实体类列表
   */
  public void startAndWait(Class... entityClasses) {
    try {
      log.info("开始重建索引...");
      createIndexer(entityClasses).startAndWait();
      log.info("完成重建索引。");
    } catch (Exception e) {
      throw new SysException("重建全文索引时发生异常。", e);
    }
  }

  /**
   * 异步创建指定实体类的全文索引。
   * 
   * @param entityClasses 实体类列表
   */
  public void start(Class... entityClasses) {
    try {
      createIndexer(entityClasses).start();
    } catch (Exception e) {
      throw new SysException("重建全文索引时发生异常。", e);
    }
  }

  /**
   * 创建索引构建组件。
   * 
   * @param entityClasses 业务实体类
   * @return 返回索引构建组件。
   */
  private MassIndexer createIndexer(Class... entityClasses) {
    FullTextEntityManager entityManager =
        Search.getFullTextEntityManager(entityManagerFactory.createEntityManager());
    return entityManager.createIndexer(entityClasses).typesToIndexInParallel(2)
        .threadsToLoadObjects(20).batchSizeToLoadObjects(25).cacheMode(CacheMode.NORMAL);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy