/ / Scrittura multipla di istanze sulla stessa cartella montata utilizzando il componente file cammello - apache-camel, osgi, smb, jbossfuse

Scrittura di più istanze sulla stessa cartella montata utilizzando il componente file cammello - apache-camel, osgi, smb, jbossfuse

Abbiamo bisogno di scrivere su un singolo file usandopiù istanze dell'interfaccia cammello in esecuzione simultaneamente. Il file si trova sul file system condiviso di Windows che è stato montato sul server JBoss utilizzando SMB.

Usiamo il componente file cammello per scrivere file da ogni istanza come file locale. Di seguito è riportato l'URI dell'endpoint nel contesto cammello

file:/fuse/server/location/proc?fileName=abc.csv&fileExist=Append

Il file generato non presenta problemi quando la scrittura avviene da una singola istanza, ma in caso di istanze multiple aggiunge caratteri indesiderati al file a righe casuali.

Stiamo usando JBoss Fuse 6.0.0 e l'interfaccia è stata scritta usando cammello 2.10 versione.

Come si puo aggiustare? È questo il problema con SMB mount o l'interfaccia che deve gestirlo.

risposte:

0 per risposta № 1

Ho dato un'occhiata al codice sorgente del relativo componente di cammello (https://github.com/apache/camel/tree/master/camel-core/src/main/java/org/apache/camel/component/file) e non esiste alcun supporto integrato per l'accesso concorrente a un singolo file da più JVM. Tuttavia, viene gestito l'accesso simultaneo da una singola JVM.

Penso che tu abbia due opzioni di base per soddisfare i tuoi requisiti:

  1. Scrivi del codice per supportare l'accesso condiviso a un singolo file. Il componente del file cammello sembra costruito con l'estensione in mente, oppure puoi creare un componente autonomo per farlo.
  2. Come @Namphibian suggerisce di utilizzare un sistema di code per serializzare le tue scritture (anche se non credo che seda funzionerà, visto che non include JVMS.

La mia soluzione sarebbe quella di usare ActiveMQ. Ogni istanza della tua applicazione invierebbe messaggi a una singola coda condivisa. Alcuni altri processi quindi consumerebbero i messaggi da MQ e li scrivere sul disco.

Con un singolo processo che consuma tutti i messaggi MQ non ci sarebbero scritture concorrenti sul filesystem.

Una soluzione più robusta dovrebbe eseguire ActiveMQ in un cluster (eventualmente con un nodo in ciascuna istanza dell'applicazione). Guarda "JMSXGroupID" per evitare il consumo simultaneo di messaggi.