yacy_search_server/source/de/anomic/crawler/AbstractImporter.java
orbiter ce1adf9955 serialized all logging using concurrency:
high-performance search query situations as seen in yacy-metager integration showed deadlock situation caused by synchronization effects inside of sun.java code. It appears that the logger is not completely safe against deadlock situations in concurrent calls of the logger. One possible solution would be a outside-synchronization with 'synchronized' statements, but that would further apply blocking on all high-efficient methods that call the logger. It is much better to do a non-blocking hand-over of logging lines and work off log entries with a concurrent log writer. This also disconnects IO operations from logging, which can also cause IO operation when a log is written to a file. This commit not only moves the logger from kelondro to yacy.logging, it also inserts the concurrency methods to realize non-blocking logging.

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@6078 6c8d7289-2bf4-0310-a012-ef5d649a1542
2009-06-15 21:19:54 +00:00

110 lines
3.1 KiB
Java

package de.anomic.crawler;
import de.anomic.yacy.logging.Log;
public abstract class AbstractImporter extends Thread implements Importer {
protected int jobID = -1;
protected String jobType;
protected Log log;
protected boolean stopped = false;
protected boolean paused = false;
protected long globalStart = System.currentTimeMillis();
protected long globalEnd;
protected long globalPauseLast;
protected long globalPauseDuration;
protected String error;
public AbstractImporter(final String theJobType) {
this.jobType = theJobType;
// initializing the logger and setting a more verbose thread name
this.log = new Log("IMPORT_" + this.jobType + "_" + this.jobID);
this.setName("IMPORT_" + this.jobType + "_" + this.jobID);
}
public String getError() {
return this.error;
}
public void startIt() {
this.start();
}
public void stopIt() throws InterruptedException {
this.stopped = true;
this.continueIt();
this.join();
}
public void pauseIt() {
synchronized(this) {
this.globalPauseLast = System.currentTimeMillis();
this.paused = true;
}
}
public void continueIt() {
synchronized(this) {
if (this.paused) {
this.globalPauseDuration += System.currentTimeMillis()-this.globalPauseLast;
this.paused = false;
this.notifyAll();
}
}
}
public boolean isPaused() {
synchronized(this) {
return this.paused;
}
}
protected boolean isAborted() {
synchronized(this) {
if (this.paused) {
try {
this.wait();
}
catch (final InterruptedException e){}
}
}
return (this.stopped) || Thread.currentThread().isInterrupted();
}
public boolean isStopped() {
return !this.isAlive();
}
public int getJobID() {
return this.jobID;
}
public void setJobID(final int id) {
if (this.jobID != -1) throw new IllegalStateException("job ID already assigned");
this.jobID = id;
}
public long getTotalRuntime() {
return (this.globalEnd == 0)?System.currentTimeMillis()-(this.globalStart+this.globalPauseDuration):this.globalEnd-(this.globalStart+this.globalPauseDuration);
}
public long getElapsedTime() {
if(this.paused) {
this.globalPauseDuration += System.currentTimeMillis()-this.globalPauseLast;
this.globalPauseLast = System.currentTimeMillis();
}
return isStopped()?this.globalEnd-(this.globalStart+this.globalPauseDuration):System.currentTimeMillis()-(this.globalStart+this.globalPauseDuration);
}
public String getJobType() {
return this.jobType;
}
public abstract long getEstimatedTime();
public abstract String getJobName();
public abstract int getProcessingStatusPercent();
}