не может ясно понять слушателя времени выполнения в Java - PullRequest
0 голосов
/ 04 февраля 2012

У меня есть фрагмент кода, который я пытаюсь понять, я никогда раньше не работал со слушателем времени выполнения, поэтому я был бы благодарен, если бы кто-нибудь указал мне хороший учебник / помог мне понять, что делает этот код.

Код для одного класса приведен ниже -

public interface ScraperRuntimeListener {

  public void onExecutionStart(Scraper scraper);

  public void onExecutionPaused(Scraper scraper);

  public void onExecutionContinued(Scraper scraper);

  public void onNewProcessorExecution(Scraper scraper, BaseProcessor processor);

  public void onExecutionEnd(Scraper scraper);

  public void onProcessorExecutionFinished(Scraper scraper, BaseProcessor processor, Map properties);

  public void onExecutionError(Scraper scraper, Exception e);

}

Теперь ниже приведен код из класса 'Scraper' - я даю только код нижеэто относится к классу, для которого я дал код выше (класс слушателя времени выполнения скребка) ...

Сначала в объявлении членов класса есть раздел -

  private List<ScraperRuntimeListener> scraperRuntimeListeners = new LinkedList<ScraperRuntimeListener>();

Тогда есть некоторые функции, которые используют вышеупомянутый класс ---

 public Variable execute(List<IElementDef> ops) {
    this.setStatus(STATUS_RUNNING);

    // inform al listeners that execution is just about to start
    for (ScraperRuntimeListener listener: scraperRuntimeListeners) {
        listener.onExecutionStart(this);
    }

    try {
        for (IElementDef elementDef: ops) {
            BaseProcessor processor = ProcessorResolver.createProcessor(elementDef, this.configuration, this);
            if (processor != null) {
                processor.run(this, context);
            }
        }
    } finally {
        releaseDBConnections();
    }

    return new EmptyVariable();
}

public void setExecutingProcessor(BaseProcessor processor) {
    this.runningProcessors.push(processor);
    Iterator iterator = this.scraperRuntimeListeners.iterator();
    while (iterator.hasNext()) {
        ScraperRuntimeListener listener = (ScraperRuntimeListener) iterator.next();
        listener.onNewProcessorExecution(this, processor);
    }
}

 public void processorFinishedExecution(BaseProcessor processor, Map properties) {
    Iterator iterator = this.scraperRuntimeListeners.iterator();
    while (iterator.hasNext()) {
        ScraperRuntimeListener listener = (ScraperRuntimeListener) iterator.next();
        listener.onProcessorExecutionFinished(this, processor, properties);
    }
}


 public void addRuntimeListener(ScraperRuntimeListener listener) {
    this.scraperRuntimeListeners.add(listener);
}

 public void removeRuntimeListener(ScraperRuntimeListener listener) {
    this.scraperRuntimeListeners.remove(listener);
}

public synchronized int getStatus() {
    return status;
}

private synchronized void setStatus(int status) {
    this.status = status;
}

public void stopExecution() {
    setStatus(STATUS_STOPPED);
}

public void exitExecution(String message) {
    setStatus(STATUS_EXIT);
    this.message = message;
}


   public void continueExecution() {
    if (this.status == STATUS_PAUSED) {
        setStatus(STATUS_RUNNING);

        // inform al listeners that execution is continued
        Iterator listenersIterator = this.scraperRuntimeListeners.iterator();
        while (listenersIterator.hasNext()) {
            ScraperRuntimeListener listener = (ScraperRuntimeListener) listenersIterator.next();
            listener.onExecutionContinued(this);
        }
    }
}

/**
 * Inform all scraper listeners that an error has occured during scraper execution.
 */
  public void informListenersAboutError(Exception e) {
    setStatus(STATUS_ERROR);

    // inform al listeners that execution is continued
    Iterator listenersIterator = this.scraperRuntimeListeners.iterator();
    while (listenersIterator.hasNext()) {
        ScraperRuntimeListener listener = (ScraperRuntimeListener) listenersIterator.next();
        listener.onExecutionError(this, e);
    }
}

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Код использует шаблон наблюдателя . Скребок уведомляет слушателей (или наблюдателей), вызывая их метод, когда он начинается, когда он заканчивается, когда он останавливается и т. Д.

0 голосов
/ 04 февраля 2012

Я не совсем уверен, что понимаю, что вы имеете в виду, но как насчет того, чтобы кодировать класс, который реализует этот ScraperRuntimeListener, и тот же класс, например, реализует Runnable, чтобы вы могли передать его в пул.Внутри прогона вы можете зарегистрировать (возможно, есть способ сделать это) этот класс, чтобы быть слушателем, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...