Apache Camel "transacted" не работает хорошо с выходным компонентом sql "outputType = StreamList" - PullRequest
0 голосов
/ 14 марта 2019

На моем маршруте верблюда, в котором я совершаю сделку, мне нужно:

  1. Вызовите oracle package , чтобы установить значение для переменной в этом package ;
  2. Выполнить оператор 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;
}

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Можете ли вы показать нам, как вы определили свой TransactionManager?В частности, связывали ли вы этот txManager со своим источником данных?

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="generalDataSource"/>
</bean>
0 голосов
/ 14 марта 2019

если это только для одной и той же базы данных, вам не нужен transacted (), который является транзакцией XA; обычно он использует разные ресурсы, например, одну JMS, другую базу данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...