1 package mircoders.global;
10 public class ProducerEngine {
11 // private Map producers;
12 private JobQueue producerJobQueue;
13 private Thread queueThread;
14 private PrintWriter log;
16 protected ProducerEngine() {
17 // producers = MirGlobal.localizer().producers().factories();
18 producerJobQueue = new JobQueue();
20 RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
21 raFile.seek(raFile.length());
22 log = new PrintWriter(new FileWriter( raFile.getFD()));
25 // throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
26 log = new PrintWriter(new NullWriter());
28 queueThread = new Thread(new ProducerJobQueueThread());
32 public void addJob(String aProducerFactory, String aVerb) {
33 // ML: TODO: should check if a similar job is already pending
34 producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
35 log.println(aProducerFactory+"."+aVerb+" added to queue");
39 public void printQueueStatus(PrintWriter aWriter) {
40 Iterator iterator = producerJobQueue.makeJobListSnapshot().iterator();
41 producerJobQueue.cleanupJobs();
44 while (iterator.hasNext()) {
45 job = (JobQueue.Job) iterator.next();
46 ProducerJob producerJob = (ProducerJob) job.getData();
48 aWriter.print(producerJob.factoryName + "." + producerJob.verb);
49 if (job.hasBeenProcessed())
50 aWriter.print(" processed");
51 else if (job.isProcessing())
52 aWriter.print(" processing");
53 else if (job.isPending())
54 aWriter.print(" pending");
56 aWriter.print(" unknown status");
58 aWriter.println("<br/>");
62 private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
67 startTime = System.currentTimeMillis();
69 aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")");
71 ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(aProducerFactory);
74 throw new Exception("No producer factory '"+aProducerFactory+"' present.");
76 Producer producer = factory.makeProducer(aVerb);
78 producer.produce(aLogger);
80 endTime = System.currentTimeMillis();
82 aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
86 aLogger.println("exception occurred:<br>");
87 aLogger.println(e.getMessage());
88 e.printStackTrace(aLogger);
95 private class ProducerJob {
96 private String factoryName;
99 public ProducerJob(String aFactory, String aVerb) {
100 factoryName = aFactory;
104 public void execute() {
105 ProducerFactory factory;
110 startTime = System.currentTimeMillis();
111 log.println("Producing job: "+factoryName+"."+verb);
114 factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get( factoryName );
117 synchronized(factory) {
118 producer = factory.makeProducer(verb);
120 if (producer!=null) {
121 producer.produce(log);
125 catch (Throwable t) {
126 log.println(" exception "+t.getMessage());
127 t.printStackTrace(log);
129 log.println("Done producing job: "+factoryName+"."+verb);
130 endTime = System.currentTimeMillis();
132 log.println("Time: " + (endTime-startTime) + " ms");
137 private class ProducerJobQueueThread implements Runnable {
139 log.println("starting ProducerJobQueueThread");
143 ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
146 producerJobQueue.flagOffJob(job);
153 catch (InterruptedException e) {
161 public static class ProducerEngineRuntimeExc extends Failure {
162 public ProducerEngineRuntimeExc(String msg, Exception cause){