import java.io.*;
import mir.producer.*;
import mir.util.*;
+import multex.Exc;
+import multex.Failure;
public class ProducerEngine {
private Map producers;
- private List Queue;
+ private JobQueue producerJobQueue;
private Thread queueThread;
+ private PrintWriter log;
- void ProducerEngine() {
+ protected ProducerEngine() {
producers = MirGlobal.localizer().producers().factories();
- Queue = new Vector();
+ producerJobQueue = new JobQueue();
+ try {
+ RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
+ raFile.seek(raFile.length());
+ log = new PrintWriter(new FileWriter( raFile.getFD()));
+ }
+ catch (Exception e) {
+// throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
+ log = new PrintWriter(new NullWriter());
+ }
+ queueThread = new Thread(new ProducerJobQueueThread());
+ queueThread.start();
+ }
-// queueThread = new Thread(
+ public void addJob(String aProducerFactory, String aVerb) {
+// ML: TODO: should check if a similar job is already pending
+ producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
+ log.println(aProducerFactory+"."+aVerb+" added to queue");
+ log.flush();
}
- void addTask(String aProducerFactory, String aVerb) {
- produceNow(aProducerFactory, aVerb, new PrintWriter(new NullWriter()));
+ public void printQueueStatus(PrintWriter aWriter) {
+
}
- void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
+ private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
try {
- aLogger.println("Producing <" + aProducerFactory + "," + aVerb + "><br>");
+ long startTime;
+ long endTime;
+
+ startTime = System.currentTimeMillis();
+
+ aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")<br>");
+
+ if (producers == null)
+ aLogger.println("??<br>");
ProducerFactory factory = (ProducerFactory) producers.get(aProducerFactory);
Producer producer = factory.makeProducer(aVerb);
producer.produce(aLogger);
+
+ endTime = System.currentTimeMillis();
+
+ aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
}
catch (Throwable e) {
try {
}
}
- private class ProducerQueueItem {
- String factory;
- String verb;
+ private class ProducerJob {
+ private String factoryName;
+ private String verb;
- public ProducerQueueItem(String aFactory, String aVerb) {
- factory = aFactory;
+ public ProducerJob(String aFactory, String aVerb) {
+ factoryName = aFactory;
verb = aVerb;
}
- public String getVerb() {
- return verb;
- }
+ public void execute() {
+ ProducerFactory factory;
+ Producer producer;
+ long startTime;
+ long endTime;
+
+ startTime = System.currentTimeMillis();
+ log.println("Producing job: "+factoryName+"."+verb);
+
+ try {
+ factory = (ProducerFactory) producers.get(factoryName);
+
+ if (factory!=null) {
+ synchronized(factory) {
+ producer = factory.makeProducer(verb);
+ }
+ if (producer!=null) {
+ producer.produce(log);
+ }
+ }
+ }
+ catch (Throwable t) {
+ log.println(" exception "+t.getMessage());
+ t.printStackTrace(log);
+ }
+ log.println("Done producing job: "+factoryName+"."+verb);
+ endTime = System.currentTimeMillis();
- public String getFactory() {
- return factory;
+ log.println("Time: " + (endTime-startTime) + " ms");
+ log.flush();
}
}
- private class ProducerQueue implements Runnable {
+ private class ProducerJobQueueThread implements Runnable {
public void run() {
- while (false) {
+ log.println("starting ProducerJobQueueThread");
+ log.flush();
+
+ while (true) {
+ ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
+ if (job!=null) {
+ job.execute();
+ producerJobQueue.flagOffJob(job);
+ }
+ else
+ {
+ try {
+ Thread.sleep(1500);
+ }
+ catch (InterruptedException e) {
+ }
+ }
}
}
}
+
+ public static class ProducerEngineRuntimeExc extends Failure {
+ public ProducerEngineRuntimeExc(String msg, Exception cause){
+ super(msg,cause);
+ }
+ }
+
}
\ No newline at end of file