/ / Wielokrotne pisanie instancji w tym samym zamontowanym folderze przy użyciu komponentu wielbłąda - apache-camel, osgi, smb, jbossfuse

Wielokrotne pisanie instancji w tym samym zamontowanym folderze przy użyciu komponentu wielbłąda - apache-camel, osgi, smb, jbossfuse

Mamy wymóg zapisu do pojedynczego pliku przy użyciuwielokrotne wystąpienie interfejsu wielbłąda działającego jednocześnie. Plik znajduje się w udostępnionym systemie plików Windows, który został zamontowany na serwerze JBoss za pomocą SMB.

Używamy komponentu pliku wielbłąda do zapisu pliku z każdej instancji jako pliku lokalnego. Poniżej znajduje się URI punktu końcowego w kontekście wielbłądów

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

Generowany plik nie ma problemów, gdy zapis dzieje się z pojedynczej instancji, ale w przypadku wielu wystąpień dodaje niepotrzebne znaki do pliku losowo.

Używamy JBoss Fuse 6.0.0 a interfejs został napisany przy użyciu wielbłąd 2.10 wersja.

Jak to może zostać naprawione? Czy jest to problem związany z montażem SMB, czy też interfejs musi go obsłużyć.

Odpowiedzi:

0 dla odpowiedzi № 1

Zerknąłem na kod źródłowy odpowiedniego składnika wielbłąda (https://github.com/apache/camel/tree/master/camel-core/src/main/java/org/apache/camel/component/file) i nie ma wbudowanej obsługi równoczesnego dostępu do pojedynczego pliku z wielu maszyn JVM, ale możliwy jest jednoczesny dostęp z pojedynczej maszyny JVM.

Myślę, że masz dwie podstawowe opcje, aby spełnić swoje wymagania:

  1. Napisz kod wspierający wspólny dostęp do pojedynczego pliku. Komponent pliku wielbłąda wygląda tak, jakby był zbudowany z myślą o rozszerzeniu, lub możesz po prostu utworzyć samodzielny komponent, aby to zrobić.
  2. Ponieważ @Namphibian sugeruje użycie jakiegoś systemu kolejkowania do serializowania twoich zapisów (chociaż nie sądzę, że seda zadziała, ponieważ nie obejmuje JVMS.

Moim rozwiązaniem byłoby użycie ActiveMQ. Każda instancja aplikacji wysyła wiadomości do pojedynczej, udostępnionej kolejki. Niektóre inne procesy pobierałyby następnie wiadomości od MQ i zapisywały je na dysku.

Z pojedynczym procesem zużywającym wszystkie komunikaty MQ, nie byłoby współbieżnych zapisów do systemu plików.

Bardziej niezawodnym rozwiązaniem byłoby uruchomienie ActiveMQ w klastrze (prawdopodobnie z węzłem w każdej instancji aplikacji). Spójrz na "JMSXGroupID", aby zapobiec równoczesnej konsumpcji wiadomości.