2016-03-24 5 views
1

Ich habe einen großen Teil der CSV-Dateien (jeder enthält rund Millionen von Datensätzen). Also verwende ich seda, um die Multi-Threading-Funktion zu verwenden. Ich teile 50000 in Stücke, verarbeite es und erhalte eine Liste von Entitätsobjekten, die ich unter Verwendung von jpa aufteilen und in der DB persistieren möchte. Anfangs bekam ich eine Out of Heap Memory Exception. Aber später verwendete ich ein hohes Konfigurationssystem und Heap-Problem wurde gelöst.Doppelte Werte von CSV werden in DB mit Apache Camel eingefügt

Aber jetzt ist das Problem, ich bekomme doppelte Datensätze in der DB eingefügt. sagen Sie, wenn es 1000000 Datensätze in der CSV gibt, werden etwa 2000000 Datensätze in DB eingefügt. Es gibt keinen Primärschlüssel für die Datensätze in den Csv-Dateien. Also habe ich Hibernate verwendet, um einen Primärschlüssel dafür zu generieren.

Unten ist mein Code (kam-context.xml)

<camelContext xmlns="http://camel.apache.org/schema/spring"> 
     <route> 
      <from uri="file:C:\Users\PPP\Desktop\input?noop=true" /> 
      <to uri="seda:StageIt" /> 
     </route> 


     <route> 
      <from uri="seda:StageIt?concurrentConsumers=1" /> 
      <split streaming="true"> 
       <tokenize token="\n" group="50000"></tokenize> 
       <to uri="seda:WriteToFile" /> 
      </split> 
     </route> 


     <route> 
      <from uri="seda:WriteToFile?concurrentConsumers=8" /> 

      <setHeader headerName="CamelFileName"> 
       <simple>${exchangeId}</simple> 
      </setHeader> 
      <unmarshal ref="bindyDataformat"> 
       <bindy type="Csv" classType="target.bindy.RealEstate" /> 
      </unmarshal> 
      <split> 
       <simple>body</simple> 
       <to uri="jpa:target.bindy.RealEstate"/> 
      </split> 
</route> 

Bitte um Hilfe.

+0

_ „Ist mein Code korrekt“ _ - wir wissen nicht, da Sie keine Informationen darüber zur Verfügung haben, was „richtig“ in Ihrer speziellen Situation ist. –

+0

Hallo Jim, ich spreche von der camel-context.xml. Gibt es einen anderen Code, den du von meiner Seite willst? – Sandy

+0

Bitte posten Sie die Mappings für 'RealEstate'. –

Antwort

0

Um die Duplikate in der DB zu eliminieren, können Sie den Primärschlüssel aus einem Hash des Inhalts eines Datensatzes erstellen, anstatt Hibernate zu verwenden, um einen zufälligen Schlüssel zu erzeugen.

+0

Ich hätte das tun können, aber wollte nur wissen, warum Kamel doppelte Datensätze einfügt. Da es keine Duplikate in der CSV-Datei gibt. Kamel fügt mehrere Male einen einzelnen Datensatz ein. – Sandy

+0

Sorry, weiß nicht, warum das passiert –

1

Konnten Sie versehentlich 2 Kontexte starten, damit die Routen zweimal durchlaufen? Wenn Wie starten Sie die Route?

1

Ich denke, das Problem kann mit "? Noop = True" sein. Da wird die Datei, die verarbeitet wird, nicht verschoben. Infolgedessen wird Camel die Datei immer wieder konsumieren. Haben Sie versucht, diese Option zu entfernen, damit Camel diese Datei in ein .camel-Unterverzeichnis verschiebt? Camel verarbeitet standardmäßig keine Dateien, die sich in einem "versteckten" Verzeichnis befinden - diejenigen, die mit DOT beginnen. Sie können auch "? MoveFailed = .failed" als Vorsichtsmaßnahme hinzufügen, damit Dateien immer in ein Verzeichnis verschoben werden, auch wenn sie fehlschlagen. Lassen Sie mich wissen, ob das hilft.

R.

+0

Ich habe das auch versucht. Aber es funktioniert nicht. – Sandy