企业搜索引擎开发之连接器connector(二十四)

本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时;其二是由连接器的自动更新机制

上文中分析了连接器的自动更新机制,即定时器执行定时任务

那么,如果我们手动操作连接器实例时,是怎么发出事件更新连接器实例的呢

通过eclipse开发工具,追踪调用ChangeDetector接口的detect()方法的方法

企业搜索引擎开发之连接器connector(二十四)

ChangeDetectorTask类的run方法里面调用我们再上文中已经分析了,其他方法便是ConnectorCoordinatorImpl实例对象的方法

即ConnectorCoordinatorImpl实例对象的如下方法,分别调用了ChangeDetector接口的detect()方法

/**

   * 移除连接器实例

   * Removes this {@link Connector} instance.  Halts traversals,

   * removes the Connector instance from the known connectors,

   * and removes the Connector's on-disk representation.

   */

  /* @Override */

  public void removeConnector() {

    synchronized(this) {

      resetBatch();

      if (instanceInfo != null) {

        instanceInfo.removeConnector();

      }

    }

    // This must not be called while holding the lock.

    changeDetector.detect();

  }



/**

   * 重启遍历

   * Retraverses the {@link Connector}'s content from scratch.

   * Halts any traversal in progress and removes any saved traversal state,

   * forcing the Connector to retraverse the Repository from its start.

   */

  /* @Override */

  public void restartConnectorTraversal() throws ConnectorNotFoundException {

    // To avoid deadlock, this method calls InstanceInfo's getters and setters,

    // rather than the local ones.

    synchronized(this) {

      resetBatch();                               // Halt any traversal.

      getInstanceInfo().setConnectorState(null);  // Discard the checkpoint.



      // If Schedule was 'run-once', re-enable it to run again.  But watch out -

      // empty disabled Schedules could look a bit like a run-once Schedule.

      Schedule schedule = getInstanceInfo().getConnectorSchedule();

      if (schedule != null && schedule.isDisabled() &&

            schedule.getRetryDelayMillis() == -1 &&

            schedule.nextScheduledInterval() != -1) {

          schedule.setDisabled(false);

          getInstanceInfo().setConnectorSchedule(schedule);

      }

    }



    // TODO: Remove this if we switch completely to JDBC PersistentStore.

    // FileStore doesn't notice the deletion of a file that did not exist.

    if (lister != null) {

      connectorCheckpointChanged(null);

    }



    // This must not be called while holding the lock.

    changeDetector.detect();

  }



/**

   * 设置配置信息

   * Sets the {@link Configuration} for this {@link ConnectorCoordinator}.

   * If this {@link ConnectorCoordinator} supports persistence this will

   * persist the new Configuration.

   */

  /* @Override */

  public ConfigureResponse setConnectorConfiguration(TypeInfo newTypeInfo,

      Configuration configuration, Locale locale, boolean update)

      throws ConnectorNotFoundException, ConnectorExistsException,

      InstantiatorException {

    LOGGER.info("Configuring connector " + name);

    String typeName = newTypeInfo.getConnectorTypeName();

    Preconditions.checkArgument(typeName.equals(configuration.getTypeName()),

        "TypeInfo must match Configuration type");

    ConfigureResponse response = null;

    synchronized(this) {

      resetBatch();

      if (instanceInfo != null) {

        if (!update) {

          throw new ConnectorExistsException();

        }

        if (typeName.equals(typeInfo.getConnectorTypeName())) {

          configuration =

              new Configuration(configuration, getConnectorConfiguration());

          response = resetConfig(instanceInfo.getConnectorDir(), typeInfo,

              configuration, locale);

        } else {

          // An existing connector is being given a new type - drop then add.

          // TODO: This shouldn't be called from within the synchronized block

          // because it will kick the change detector.

          removeConnector();

          response = createNewConnector(newTypeInfo, configuration, locale);

          if (response != null) {

            // TODO: We need to restore original Connector config. This is

            // necessary once we allow update a Connector with new ConnectorType.

            // However, when doing so consider: createNewConnector could have

            // thrown InstantiatorException as well.  Also, you need to kick

            // the changeDetector (but not in this synchronized block).

            LOGGER.severe("Failed to update Connector configuration.");

            //    + " Restoring original Connector configuration.");

          }

        }

      } else {

        if (update) {

          throw new ConnectorNotFoundException();

        }

        response = createNewConnector(newTypeInfo, configuration, locale);

      }

    }

    if (response == null) {

      // This must not be called while holding the lock.

      changeDetector.detect();

    } else {

      return new ExtendedConfigureResponse(response, configuration.getXml());

    }

    return response;

  }



/**

   * 设置定时调度

   * Sets the traversal {@link Schedule} for the {@link Connector}.

   *

   * @param connectorSchedule Schedule to store or null to unset any existing

   *        Schedule.

   * @throws ConnectorNotFoundException if the connector is not found

   */

  /* @Override */

  public void setConnectorSchedule(Schedule connectorSchedule)

      throws ConnectorNotFoundException {

    synchronized(this) {

      // Persistently store the new schedule.

      getInstanceInfo().setConnectorSchedule(connectorSchedule);

    }

    // This must not be called while holding the lock.

    changeDetector.detect();

  }

接下来ChangeDetector接口的detect()方法其实又调用了自身的实现ConnectorCoordinatorImpl实例对象的实现ChangeHandler接口的方法

ConnectorCoordinatorImpl-->ChangeDetector的detect()-->ChangeListener的相关方法-->ChangeHandler(ConnectorCoordinatorImpl实例对象)的相关方法

所以手动操作与自动更新机制实际上是殊途同归,最后都是调用了ChangeHandler(ConnectorCoordinatorImpl实例对象)的相关方法

---------------------------------------------------------------------------

本系列企业搜索引擎开发之连接器connector系本人原创

转载请注明出处 博客园 刺猬的温驯

本人邮箱: chenying998179@163#com (#改为.)

本文链接 http://www.cnblogs.com/chenying99/p/3776515.html 

你可能感兴趣的:(connector)