2016-04-20 7 views

Antwort

2

Sie können nicht; das gleiche JdbcTemplate wird für beide Operationen verwendet; Sie können die Aktualisierungsabfrage weglassen und das Update für einen Outbound-Channel-Adapter durchführen.

+0

Hallo Gary _ Ich sehe Sie Punkt, können Sie mir bitte helfen, das unten zu verstehen ....
1. Ich muss für IDs (mehr als 1) aus Datenquelle A auswählen.
2. Dann muss ich diese IDs übergeben, um Abfrage 2 mit Dsource B auswählen.
3. Schließlich die Ausgabe von Punkt 2, ich habe für die Aktualisierung mit Datsource verwenden A – Gaurav

+0

Versuchen Sie nicht, Logik in Kommentare zu setzen, tut es nicht mach es nicht gut. Bearbeite stattdessen die Frage. Sie benötigen 'jcbc-inbound-adapter-> jdbc-outbound-gateway-> jdbc-outbound-adapter' mit allen erforderlichen Transformatoren dazwischen. –

0

Im Frühjahr JDBC-Modul haben wir so etwas wie AbstractRoutingDataSource. Welche Sie basierend auf einigen Variablen ThreadLocal implementieren können.

Von anderer Seite der JdbcPollingChannelAdapter hat Code wie folgt:

private Object poll() { 
    List<?> payload = doPoll(this.sqlQueryParameterSource); 
    ... 
    executeUpdateQuery(payload); 

    return payload; 
} 

Also, sollten Sie irgendwie zwischen doPoll() und executeUpdateQuery und daher ändern Sie den Schlüssel in der ThreadLocal in einzuhaken zum anderen wechseln zu können, DataSource in der AbstractRoutingDataSource.

Ich nur den Hack wie benutzerdefinierte sqlParameterSourceFactory.createParameterSource() und die ThreadLocal Modifikation dort. Nur weil der Code wie:

private void executeUpdateQuery(Object obj) { 
    SqlParameterSource updateParamaterSource = this.sqlParameterSourceFactory.createParameterSource(obj); 
    this.jdbcOperations.update(this.updateSql, updateParamaterSource); 
} 

(Wird das Update für updateParamaterSource Typo bald :-) begehen).

Aber! Wie Gary in seiner Antwort erwähnt, wäre es besser, mehrere JDBC-Adapter für verschiedene DataSource s zu haben: einen für SELECT und einen weiteren für UPDATE. Beide können in derselben XA-Transaktion arbeiten (<transactional> auf der <poller>). Und von da unterscheiden wir wirklich die Geschäftslogik und das Verantwortungsniveau.