@unomichisiada:
Tutto in Java!
@magnus:
Non penso proprio: del resto un server deve essere in grado di gestire letture e scritture "simultanee", concorrenti e frequenti (se penso, ad esempio, alla realtà lavorativa in cui mi trovo, dove ogni giorno una trentina di utenti utilizzano lo stesso server pesantemente con operazioni di ogni genere + qualche altro migliaio di clienti sparsi in tutta italia accedono "indirettamente" allo stesso server per il sito...)
Non ho nessuna difficoltà a postare il codice del demone (la sua struttura, perlomeno):
Non posto la classe FatturePDF: prende un file e genera un PDF (oltre a fare altre cose)codice:import java.io.*; import java.util.Vector; import java.util.GregorianCalendar; public class DemoneFatture extends Thread { private boolean attivo; // Flag: indica se il demone è attivo o no private int tempo; // Millisecondi di attesa tra un controllo e l'altro private long intervallo; // Millisecondi di attesa per rispetto orario di funzionamento private String monitor; // Directory da monitorare private File tmpDir; // Directory temporanea private String [] contenuto; // Contenuto della directory monitor al momento del controllo private boolean[] lock; // Flags di lock per il file in 'contenuto' private Buffer buffer; // Buffer per lo Spazzino private GregorianCalendar oraInizio; // Ora di inizio del monitoraggio private GregorianCalendar oraFine; // Ora di fine del monitoraggio private PrintStream oldOut; private PrintStream newOut; private Fatture fat; public DemoneFatture(Fatture fat, String monitor, String oraInizio, String oraFine, Buffer buffer) { tempo = 1000; // 1 secondo di attesa attivo = true; monitor = monitor.replaceAll("\\\\", "/"); if (monitor.charAt(monitor.length()-1) != '/') monitor += "/"; this.fat = fat; this.monitor = monitor; this.oraInizio = genera( oraInizio ); this.oraFine = genera( oraFine ); this.buffer = buffer; try { oldOut = System.out; newOut = new PrintStream( new java.io.FileOutputStream("logFileFatture.log") ); System.setOut( newOut ); System.setErr( newOut ); } catch (Exception e) { e.printStackTrace(); } } public void run() { try { tmpDir = new File("./tempFat/"); if (!tmpDir.exists()) { if (!tmpDir.mkdir()) { System.out.println("Impossibile creare la directory temporanea!"); attivo = false; } } while( attivo ) { if ( controllaOrario() ) { controllaDirectory(); sleep(tempo); } else { System.out.println("-- Ora termine monitoraggio: " + stampaOra(new GregorianCalendar())); System.out.println("-- Ora prevista ripresa monitoraggio: " + stampaOra(oraInizio)); sleep(intervallo); } } } catch (Exception e) { System.out.println("-- DEMONE FERMO --"); e.printStackTrace(); } } private String normalizza(int num) { return (num > 9) ? "" + num : "0" + num; } private String stampaOra(GregorianCalendar gc) { int ampm = gc.get(gc.AM_PM); int aggiunta = (ampm == gc.PM) ? 12 : 0; return "" + normalizza(gc.get(gc.HOUR) + aggiunta) + ":" + normalizza(gc.get(gc.MINUTE)) + ":" + normalizza(gc.get(gc.SECOND)); } private GregorianCalendar genera(String ora) { int ore = Integer.parseInt( ora.substring(0, 2) ); int minuti = Integer.parseInt( ora.substring(3, 5) ); GregorianCalendar tmp = new GregorianCalendar(); return new GregorianCalendar(tmp.get(tmp.YEAR), tmp.get(tmp.MONTH), tmp.get(tmp.DATE), ore, minuti); } private boolean controllaOrario() { boolean ret = false; GregorianCalendar gc = new GregorianCalendar(); int ampm; long aggiunta = 0; ret = gc.before(oraFine) && gc.after(oraInizio); if ( !ret ) { ampm = gc.get(gc.AM_PM); if (ampm == gc.PM) aggiunta = (long) 12; long oreAttuali = gc.get(gc.HOUR) + aggiunta; long minutiAttuali = gc.get(gc.MINUTE); long secondiAttuali = gc.get(gc.SECOND); ampm = oraInizio.get(oraInizio.AM_PM); aggiunta = 0; if (ampm == oraInizio.PM) aggiunta = (long) 12; long oreInizio = oraInizio.get(gc.HOUR) + aggiunta; long minutiInizio = oraInizio.get(gc.MINUTE); long minutiDiff = 0; if ( gc.after(oraInizio) ) { minutiDiff = 1440 - (((oreAttuali * 60) + minutiAttuali) - ((oreInizio * 60) + minutiInizio)); } else { minutiDiff = ((oreInizio * 60) + minutiInizio) - ((oreAttuali * 60) + minutiAttuali); } long secondiDiff = - secondiAttuali + 10; intervallo = ((minutiDiff * 60) + secondiDiff) * 1000; } fat.setStatoDemone( ret ); return ret; } private void controllaDirectory() { String suffix = ""; try { File dir = new File(monitor); if ( dir.exists() ) { contenuto = dir.list(); lock = new boolean[contenuto.length]; for (int j=0; j<lock.length; j++) lock[j] = !contenuto[j].endsWith(".lock"); String fileOut = ""; for (int i=0; i<contenuto.length; i++) { if ( !contenuto[i].endsWith(".lock") ) { if ( !sposta(monitor+contenuto[i], tmpDir.toString()+File.separator+contenuto[i]) ) { System.out.println("Impossibile creare il file temporaneo: "+(new File(tmpDir.toString()+File.separator+contenuto[i])).toString()); lock[i] = false; } else { suffix = contenuto[i].substring(contenuto[i].length()-6, contenuto[i].length()-4); contenuto[i] = tmpDir.toString()+File.separator+contenuto[i]; if (suffix.toUpperCase().equals("_M")) FatturePDF.generaPDF(contenuto[i], "COPIA MITTENTE"); if (suffix.toUpperCase().equals("_D")) FatturePDF.generaPDF(contenuto[i], "COPIA DESTINATARIO"); if (suffix.toUpperCase().equals("_V")) FatturePDF.generaPDF(contenuto[i], "COPIA VETTORE"); if (suffix.toUpperCase().equals("_C")) FatturePDF.generaPDF(contenuto[i], "COPIA CONFORME"); } } } if (contenuto.length > 0) { Vector v = new Vector(); for (int j=0; j<contenuto.length; j++) { if (lock[j]) v.add( contenuto[j] ); } String[] listaPassata = new String[v.size()]; for (int j=0; j<listaPassata.length; j++) listaPassata[j] = (String) v.elementAt(j); buffer.aggiungi(listaPassata); } } else { System.out.println(stampaOra( new GregorianCalendar() ) + ": Directory inesistente."); } } catch (Exception e) { System.out.println("Errore individuato, ma ignorato:"); e.printStackTrace(); } } private boolean sposta(String src, String dst) throws Exception { boolean result = false; try { FileInputStream fis = new FileInputStream( src ); FileOutputStream fos = new FileOutputStream( dst ); byte [] buf = new byte[fis.available()]; int letti = fis.read( buf ); if (letti > 0) { fos.write( buf ); fos.flush(); fos.close(); fis.close(); } if ( (new File(src)).delete() ) { result = true; } else { (new File(dst)).delete(); } } catch (IOException ioe) { result = false; } return result; } public void ferma() { attivo = false; fat.setStatoDemone( false ); } }
Non posto nemmeno la classe Spazzino (poco interessante): è un thread che si occupa di cancellare i temporanei quando il programma di generazione PDF ha finito di utilizzarli.
Cosa fa: monitora una ditrectory (remota). Quando trova un file lo copia in locale e lo cancella dalla remota. Quindi lo elabora.
Il tutto viene temporizzato: la sua creazione richiede il passaggio di un orario di inizio e un orario di fine funzionamento + un puntatore ad una finestra che riceve dei messaggi.
Ciao.![]()




Rispondi quotando