Newsgroup: it.comp.java
Titolo: 3 metodi

Ho tre metodi, su uno stesso oggetto, che devono essere chiamati in sequenza e
devo essere sicura che un metodo non inizi prima che il precedente sia concluso.
( uno inoltre è un exec ,cioè attiva un processo esterno )
Penso dovrei usare una sincronizzazione ma non so come ; qualcuno può aiutarmi con una traccia / esempio ?
Grazie mille

 Penso dovrei usare una sincronizzazione ma non so come ; qualcuno può
aiutarmi con una traccia / esempio ?
 
dovresti invece essere un po' più chiara nella richiesta,
magari posta il pezzo di codice su cui hai dubbi.
 

In realtà credo non sia così.
Da quanto ho letto i vari metodi non sono eseguiti rigorosamente uno dopo l'altro a meno che non siano definiti sincronizzati.
http://docs.oracle.com/javase/jndi/tutorial/beyond/misc/sync.html
 
Questo anche se non usi esplicitamente i thread.
Ho infatti un metodo che scrive un file di 2000 righe e questo file viene letto dal secondo metodo prima che sia completo.


Per capirci:
File,scrivi_file(...vari parametri....);
File.leggi_file(...vari_parametri...);
leggi_file legge il file fino ad una riga diaciamo 1031 ( non sempre la stessa)

 viene letto dal secondo metodo prima che sia completo.
 
un bel flush() + close() dello stream che scrive e magicamente tutto 
torna alla normalità.
 
credimi, stai prendendo delle cantonate.
 
 

 stessa)
 
ribadisco che stai prendendo una cantonata.
la ragione per cui il secondo metodo non trova tutte le righe non è un 
problema di concorrenza ma di buffering. molto banalmente sullo stream di 
scrittura non esegui il flush() e le righe mancanti sono ancora nel 
buffer.

close l'ho usato, flush no devo provare poi ti so dire
Grazie

 Grazie
 
Ho usato flush per lo stream, la situazione è migliorata ma ancora non ci siamo.
L'anomalia sta nel primo metodo , quello che scrive il file.
Non tutto il flusso viene scritto, come se il file fosse chiuso prima che tutti i dati siano scritti.
Nesun errore o eccezione apparente.
Da cosa può dipendere ?

Vorrei approfittare per porre un'altra domanda.
Il file generato è un file html 
con dati provenienti da una query SQL.
Vorrei realizzare un pdf ,( non posso usare software fuori da GPL o simili ). 
Di solito uso pdfbox, tuttavia dato che il file è lungo circa 15 pagine ed è a lunghezza variabile è complicato settare margini, prevedere interruzioni di pagina etc.. in modo sempre perfetto.
In una pagina html, come sapete, è molto più semplice.
Cosa mi suggerite ?  
Grazie

 ha scritto:

potresti provare ad usare in alternativa la libreria iText
 
http://sourceforge.net/projects/itext
 
 


iText mi piace ma purtroppo ci sono problemi di licenza per un uso non personale e ho dovuto escluderla

Ripeto anche il post precedente se qualcuno ha ipotesi .


 ci siamo.
 
E finché non mostri un esempio per riprodurre il problema secondo me 
così rimane.
 
-- 
Andrea
 

Il problema era dovuto a quello che supponevo.
 
C'è un certo grado di parallelismo fra le API di java e le sottostanti funzioni OS di filesystem in maniera simile a quanto avviene per i thread in java stesso.
 
In sostanza usare flussi autoflush o flush() per chiudere flussi e file è utile ma non assicura che i file siano realmente disponibili, almeno non subito.
 
Usando i metodi della classe Path per avere un riscontro sul filesystem e facendo iniziare gli altri metodi che operano sui file creati a seconda di tali controlli, tutto torna regolare.
 
Grazie a tutti per la vostra attenzione.
 
Rimane valido il dubbio sul pdf di cui parlo nel precedente messaggio.

 thread in java stesso.
 
permettimi almeno di esprimere dei dubbi sulla tua analisi. vediamo il 
codice poi commentiamo.

Capisco la richiesta.
Purtroppo rendere "neutra" la parte del codice in questione richiede molti cambiamenti e non posso pubblicarlo così come è (il codice non è personale ).
Ti posso però mostrare una trattazione più rigorosa del problema
http://www.sigops.org/sosp/sosp09/papers/porter-sosp09.pdf
 
E' evidente che in piccoli messaggi sui newsgroup è difficile essere esatti e spesso ci fraintendiamo.
L'articolo descrive il punto piuttosto semplicemente. 
Il problema non è nuovo è vero, ma identificarlo nel caso concreto non mi è riuscito prima.
Su internet si trovano comunque diversi esempi di codice che riguardano questi aspetti. 
 

 questi aspetti.
 
scusa eh, ma un esempio di codice dove scrivo un file e di seguito lo 
rileggo non ho certo bisogno di andare a cercarlo su internet. il fatto è 
che non riproduco il problema che dici di aver avuto. siccome non so 
quale fosse questo problema, dici che puoi mostrare il tuo codice ma se 
sostieni che è replicato in diversi esempi su internet allora indicami 
uno di questi esempi. 
 
è inutile tu mi faccia vedere un papiro di 20 pagine sulle transazioni 
ovvero tutto quello che fa il sistema operativo affinché *non* avvenga 
quello che tu dici sia avvenuto...

L'articolo menziona il tipo di problema 
Pag 1 ABSTRACT
Applications must be able to synchronize accesses to oper-
ating system resources in order to ensure correctness in the
face of concurrency and system failures
 
cerca su internet (TOCTTOU) =
 time of check to time of use e trovi tutto quello che ti serve
 oppure race conditions 
 
Mi pare di aver letto anche una breve nota oracle nella trattazione della classe Path al riguardo di TOCTTOU ma non la ho tra i preferiti.
 
Normalmente questi problemi non si verificano perchè i file dati generati 
sono di limitata dimensione.
In ultima analisi è molto semplice ( è una semplificazione imprecisa ma forse immediata):
1) generi un file molto complesso e lungo
2) la VM "dice al OS di scriverlo (nota VM a OS)
3) la VM lo suppone scritto e lo richiede all' OS immediatamente ma il file ancora non è "completo" (nota OS a VM)

 file ancora non è "completo" (nota OS a VM)
 
stai dicendo che l'accesso al file system non è deterministico, ovvero se 
scrivo un file non posso sapere se e quando sarà disponibile per essere 
riletto. 
direi azzardato, non trovi?
 

Mi sembrava di aver inserito una risposta ma non la vedo.
Ma rispondi all'autore tra le opzioni serve per caso per inviare un'email 
a parte ?
 
Comunque il problema è semplice: concorrenza tra VM e OS con assenza di sincronizzazione.
Vedere il caso delle transazioni nel db come esempio similare.
 
Piuttosto come dicevo devo ricavare un pdf da una tabella di 2000 - 25000 righe con 15 elementi per riga.
Ho un file html che è più semplice da realizzare.
 
E' difficile prevedere spazi, interruzioni di pagina , margini etc... per file pdf così vasti e con contenuto variabile.
 
Non posso usare prodotti non free.
 
Qualcuno può suggerirmi qualcosa ?
Grazie

 Usando i metodi della classe Path per avere un riscontro sul filesystem e
facendo iniziare gli altri metodi che operano sui file creati a seconda di tali
controlli, tutto torna regolare.
 
che in pratica te l'avevo già suggerito prima:


 Qualcuno può suggerirmi qualcosa ?
 
Vedi JasperReports.
 
-- 
Andrea
 

 Andrea
 
Guarda che il pdf è da fare in java , il problema è attinente al gruppo.
 
Come ho detto il problema è stato risolto facendo riferimento ad articoli
 in materia di una certa autorevolezza.
Non è detto che siano alla portata di tutti ma se si hanno le competenze necessarie tutto si comprende.


Hai ragione , mi spiace ma non avevo colto il punto

Su JasperReport
 
L'ho usata in passato che mi ricordi, ma non ho visto le nuove versioni.
Mi ricordo che ha una stretta relazione con Ant.
 
Potrebbe essere usata, se non trovo alternative.

 capito nulla 
 
Può capitare che qualcuno si sia annoiato, che ci posso fare.
Ma come vedi "ciccio" ( autore di alcuni post ) aveva capito 
il problema e indicato la soluzione anche molto presto.
 

 per file pdf così vasti e con contenuto variabile.
 
cioè devi fare un report. usa jasper report+ireport.

 Potrebbe essere usata, se non trovo alternative.
 
mi spieghi per quale ragione sputi a prescindere sui consigli, peraltro 
richiesti, che ti vengono dati?
se hai una query e/o un resultset da trasformare in report pdf la 
soluzione più immediata è jasperreports. poi magari non calzerà al tuo 
caso, ma almeno accertatene prima di classificarla come extrema ratio. le 
alternative ce ne sono a bizzeffe ma sono a più basso livello, cioè ti 
devi mettere lì e con un set di api costruirti il pdf, il che non mi pare 
risponda alle esigenze che hai esposto. in ogni caso:
 
http://pdfbox.apache.org/
 
 
http://www.stefanochizzolini.it/en/projects/clown/
 
 
http://itextpdf.com/
 
 
http://sourceforge.net/projects/jpodlib/
 
 
http://pdfjet.com/os/edition.html
 
 
http://code.google.com/p/flying-saucer/
 (ma usa itext)
 
 

 ha scritto:

grazie maria sono lusingato........ XD
scherzi a parte anche gli autori degli altri post hanno
dato consigli utili e anzi alcuni di loro sono molto in gamba ;)