Я использую Apache Camel и Spring Boot для реализации процесса интеграции между двумя таблицами. Исходная таблица включает в себя более 1000 записей. Что я хочу сделать, так это после внесения некоторых изменений в исходные данные, эти данные должны быть вставлены в другую таблицу в той же базе данных. Я застрял на этапе вставки данных.
<camelContext id="Integrator" xmlns="http://camel.apache.org/schema/spring">
<route id="hello">
<from id="timer" uri="timer:test?period={{timer.period}}"/>
<setBody id="query">
<constant>SELECT * FROM abc WHERE code = 'MDV1'</constant>
</setBody>
<log id="log_1" message="log msg"/>
<to id="jdbc_con" uri="jdbc:dataSource"/>
<process id="changebody" ref="editPayload"/>
<log id="log_2" message="process row ${body}"/>
</route>
</camelContext>
Обновлено:
Это не точный ответ, который я хотел. Но этот поток может вставить запись из исходной таблицы в цель. В этом решении запись будет вставлена в целевую таблицу одна за другой. Я хотел вставить как объемную на заключительном этапе вместо того, чтобы вставить один за другим.
<camelContext id="Integrator"
xmlns="http://camel.apache.org/schema/spring">
<route id="data_transfer">
<from id="timer" uri="timer:abcStaging?period={{timer.period}}" />
<setBody id="select_query">
<constant>select * from abc</constant>
</setBody>
<to id="jdbc_con_select" uri="jdbc:dataSource" />
<split>
<simple>${body}</simple>
<process id="change_body" ref="editPayload" />
<to id="jdbc_con_insert" uri="sql:{{sql.abcStaging}}" />
<log id="log_1" message="Inserted abcStaging" />
</split>
</route>
</camelContext>
файл свойств:
sql.abcStaging =insert into abcStaging (id, rate) values (:#id, :#rate)
editPayload Bean:
public class ChangePayload implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
LinkedHashMap linkedHashMap = (LinkedHashMap) exchange.getIn().getBody();
Map<String, Object> staging = new HashMap<>();
/* data changing logics */
staging.put("id", "id");
staging.put("rate", "rate");
exchange.getOut().setBody(staging);
}
}