2013-05-02 7 views
9

mio scenario di elaborazione dei file è,elaborazione file a due computer diverso usando primavera lotto

read input file -> process -> generated output file 

ma devo due macchine fisicamente diversi che sono collegati ad un'area di stoccaggio in cui ricevo tutti i file di input e un database server, ci sono due server applicazioni in esecuzione su questi computer (1 su ciascun server).

enter image description here

Così come posso usare primavera batch per elaborare i file di input su entrambi questi server applicazioni parallelamente? Voglio dire se ci sono 10 file il 5 su server1 (P1) e 5 su (P2), può essere fatto?

+0

file di output generato = scrivere il risultato nel database ?, oppure il database viene utilizzato solo per metadati batch di primavera? e in effetti scrivi nuovamente i file di output nella casella del tuo file system? – Cygnusx1

+0

sì, devo generare il file put sul file system, DB è usato per memorizzare i dettagli del file di input e dopo aver elaborato quei dettagli devo generare il file put. –

+0

Se non ci sono dipendenze tra i tuoi file, non vedo perché non potresti farlo. L'unica cosa che devi controllare è di evitare di processare lo stesso file in entrambi i lavori !! Ma questa sarebbe la responsabilità del chiamante ... Come inizi il tuo lavoro? Cedolare? un ksh? – Cygnusx1

risposta

-1

C'è un modo piuttosto semplice per farlo. Se ho capito bene, metti tutti i file nel database (alcune informazioni su di esso) e poi rimuovi per creare un nuovo output. È possibile bloccare() su di esso, Prima lettura del file u check

for(File file : fileList.getFiles()) 
    try{ 
     (getting file + process it) 
     } 

e nel processo di

 file.lock(); 
    try { 
     ... 
    } finally { 
     file.unlock(); 
    } 

Ecco alcune informazioni su Lock.

+1

funziona questo blocco se sono coinvolte due JVM? poiché sono coinvolte diverse macchine che non sono collegate. –

4

È possibile pianificare un lavoro per file di input (la posizione del file di input è un parametro del lavoro). Spring Batch garantisce che non vengano create due istanze di lavoro con gli stessi parametri di lavoro. Otterrai uno JobExecutionAlreadyRunningException o JobInstanceAlreadyCompleteException se l'altro nodo ha già iniziato ad elaborare lo stesso file.

+0

Questa è la soluzione per il problema batch piuttosto classico aperto qui. –

+0

Otterrò JobExecutionAlreadyRunningException questa eccezione se i lavori vengono eseguiti da due macchine diverse? Poiché l'EAR dell'applicazione verrà distribuito su entrambe queste macchine che attivano questi lavori. –

1

La prima cosa da decidere è se si desidera dividere i file a metà (5 e 5) o se si desidera che ogni server venga elaborato fino al termine? Se i file sono di varie dimensioni con alcuni piccoli e altri più grandi, si può finire con una parallelizzazione ottimale con 6 elaborati su un server e 4 sull'altro, o 7 e 3, se i 3 richiedono l'altro 7 a causa delle differenze in misura.

Un modo molto rudimentale sarebbe avere una tabella di database che potrebbe rappresentare un'elaborazione attiva. Il tuo lavoro potrebbe leggere la directory, prendere il primo nome di file e quindi inserire nella tabella che è stata elaborata da quella JVM. Se la chiave primaria della tabella è il nome file, se entrambi provano allo stesso tempo, uno fallirebbe e uno avrebbe successo. Quello che riesce a inserire la voce nella tabella vince e ottiene elaborare il file. L'altro deve gestire quell'eccezione, selezionare il file successivo e tentare di inserirlo come una voce di elaborazione. In questo modo ognuno stabilisce essenzialmente un blocco centralizzato (nella tabella db), e si ottiene un'elaborazione più efficiente che considera le dimensioni del file piuttosto che la distribuzione dei file.

0

qui sono i miei suggerimenti:

  • creare una tabella di blocco in db con il percorso file come chiave primaria. Quindi prova a inserire un record con questa chiave - se riesce, il codice può continuare ed elaborare il file, se fallisce (eccezione, quel record con questa chiave primaria esiste), quindi vai al file successivo.

  • precisa pianificazione, come accennato in precedenza da Jimmy

  • si può provare a utilizzare una coda (come ActiveMQ, RabittMQ, ...) per sincronizzare le macchine

Problemi correlati