На моем маршруте верблюда, в котором я совершаю сделку, мне нужно:
- Вызовите oracle package , чтобы установить значение для переменной в этом package ;
- Выполнить оператор sql, использующий переменную из package ;
Обратите внимание, что переменная пакета видна только в том соединении, из которого она была установлена, поэтому мне нужно использовать здесь "transacted".
Вот пример кода, который демонстрирует проблему:
from("direct-vm:process")
.transacted()
.to("sql:call my_pack.set_v1('10')")
.to("sql:select my_pack.get_v1 from dual?outputType=StreamList")
.split(body()).streaming()
.log("${body}")
.end();
Результат для приведенного выше кода будет: GET_V1 = null
Если я прокомментирую «.transacted ()», я получу: GET_V1 = 10
Если я удаляю опцию «StreamList» из sql и отменяю комментарий «.transacted ()»: GET_V1 = 10
Вопрос : не может ли "transacted" работать с опцией "StreamList" компонента sql?
Дополнительная информация:
Если я начну выше маршрут в нескольких потоках, например:
Map<String, String> map = new HashMap<>();
map.put("10", "10");
map.put("20", "20");
map.put("30", "30");
map.put("40", "40");
map.put("50", "50");
map.forEach((key, values) -> {
from("timer://runOnce?repeatCount=1")
.setHeader("key", constant(key))
.setHeader("value", constant(values))
.inOnly("seda:processParallel");
});
from("seda:processParallel?concurrentConsumers=5")
.to("direct:process");
from("direct:process")
//.transacted()
.to("sql:call my_pack.pset_v1(:#value)?dataSource=generalDataSource")
.to("sql:select :#key key, my_pack.get_v1 value from dual?outputType=StreamList")
.split(body()).streaming()
.to("log:row")
.end();
Я получу противоречивые результаты:
KEY=**20**, VALUE=**50**
KEY=**50**, VALUE=**40**
KEY=**40**, VALUE=**20**
KEY=**10**, VALUE=**30**
KEY=**30**, VALUE=**10**
Менеджер транзакций настраивается, как показано ниже:
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}