2016-05-05 8 views
0

Ich versuche, einige Daten aus einer CSV-Datei in eine saubere Datenbankinstanz zu laden. Dazu habe ich einen ETL-Prozess mit Apache Camel erstellt, liest die Eingabe-CSV, teilt die Datei in mehrere Zeilen auf und verarbeitet jede Zeile parallel mit einer Transaktion pro Zeile.TransactionManagerException: Transaktion ist für diesen Thread nicht aktuell

Klasse ImportRouteBuilder erweitert RouteBuilder {

private final Importer importer 
private final String endpoint 

public ImportRouteBuilder(Importer importer, String endpoint) { 
    this.endpoint = endpoint 
    this.importer = importer 
} 

@Override 
void configure() throws Exception { 
    from(endpoint) 
      .unmarshal(buildCsvDataFormat()) 
      .split(body()) 
      .parallelProcessing() 
      .bean(importer) 
} 

private static CsvDataFormat buildCsvDataFormat() { 
    CsvDataFormat csv = new CsvDataFormat(); 
    csv.skipHeaderRecord = true 
    csv 
} 

}

@Slf4j 
@Service 
class CountryCsvImporter implements Importer { 
    @Autowired 
    private CountryRepository countryRepository 

    @Autowired 
    private Session session 

    @Override 
    void process(List record) { 
     Transaction tx = session.beginTransaction(); 
     try { 
      importCountry(record) 
      tx.commit() 
     }catch (Throwable t) { 
      tx.rollback() 
    } 
    tx.close() 
    } 

ich dies, weil nicht geladen wurde CSV Chiffre oder Neo4j Import-Tool zu verwenden, während mein Modell entwickelt haben gesucht nach wie vor, da es sehr praktisch, OGM beim Prototyping zu verwenden. Aber jetzt habe ich eine Wand in der Mitte des Prozesses gefunden OGM generiert diese TransactionManagerException, es sieht aus wie es war ein Threading-Problem Transaktionen zu verwalten.

bei com.cartrawler.service.CountryImportSpecification.Should der Lage sein Land csv zu importieren (CountryImportSpecification.groovy: 9) Verursacht durch: org.neo4j.ogm.exception.TransactionManagerException: Transaktion ist nicht aktuell für diesen Thread bei org.neo4j.ogm.session.transaction.DefaultTransactionManager.rollback (DefaultTransactionManager.java:78) bei org.neo4j.ogm.transaction.AbstractTransaction.rollback (AbstractTransaction.java:65) bei org.neo4j. ogm.drivers.embedded.transaction.EmbeddedTransaction.rollback (EmbeddedTransaction.java:60) bei com.cartrawler.service.CountryCsvImporter.process (CountryCsvImpo rter.groovy: 28)

Danke, freundlich Luis Oscar

+0

Ich habe versucht, die Formatierung Ihrer Frage zweimal zu korrigieren, nur um es einfacher zu lesen, aber Sie ändern es immer wieder zurück. Wenn Sie es selbst beheben möchten, erfahren Sie, wie Sie Ihren Code und Stacktraces einrücken (http://meta.stackexchange.com/questions/22186/how-doi-i-format-my-code-blocks). – cybersam

Antwort

1

Parallelverarbeitung Schalten Sie als Transaktion nur einzelne Threads.

+0

Danke das hat funktioniert. –

+0

Hallo Claus, ich war in der Lage, den Import parallel zu bekommen, wenn er in Spring-Daten verschoben wurde und Importeur von einer seda-Queue lief. –

+0

@ClausIbsen Bedeutet dies, dass ein gleichzeitiger Zugriff auf die Datenbank unmöglich ist? Wie deaktiviere ich die Parallelverarbeitung? – Polyakoff