我有一段代码我正在尝试理解,我以前从未使用过运行时侦听器,所以如果有人能给我一个好的教程/帮助我理解这段代码,我将不胜感激。
一个类的代码如下--
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运行时侦听器类)……
首先,在类成员的声明中有一个部分--
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);
}
}发布于 2012-02-04 15:49:05
代码使用的是observer pattern。抓取器通过调用监听器(或观察者)的方法来通知监听器(或观察者),当它开始时,当它结束时,当它暂停时,等等。
发布于 2012-02-04 16:20:59
我不能完全肯定我明白你的意思,但是如果你编写一个实现这个ScraperRuntimeListener的类,并且同样的类实现Runnable,这样你就可以把它提交到一个池中。例如,在run中,你可以注册(可能有一种方法可以做到这一点)这个类成为监听器。
https://stackoverflow.com/questions/9139285
复制相似问题