首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法清楚地理解java中的运行时侦听器。

无法清楚地理解java中的运行时侦听器。
EN

Stack Overflow用户
提问于 2012-02-04 15:41:44
回答 2查看 298关注 0票数 0

我有一段代码我正在尝试理解,我以前从未使用过运行时侦听器,所以如果有人能给我一个好的教程/帮助我理解这段代码,我将不胜感激。

一个类的代码如下--

代码语言:javascript
复制
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”类的一些代码--我在下面只给出了引用上面给出代码的类的代码(scraper运行时侦听器类)……

首先,在类成员的声明中有一个部分--

代码语言:javascript
复制
  private List<ScraperRuntimeListener> scraperRuntimeListeners = new LinkedList<ScraperRuntimeListener>();

然后有一些函数利用了上面的类

代码语言:javascript
复制
 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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2012-02-04 15:49:05

代码使用的是observer pattern。抓取器通过调用监听器(或观察者)的方法来通知监听器(或观察者),当它开始时,当它结束时,当它暂停时,等等。

票数 3
EN

Stack Overflow用户

发布于 2012-02-04 16:20:59

我不能完全肯定我明白你的意思,但是如果你编写一个实现这个ScraperRuntimeListener的类,并且同样的类实现Runnable,这样你就可以把它提交到一个池中。例如,在run中,你可以注册(可能有一种方法可以做到这一点)这个类成为监听器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9139285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档