Apache Camel“已处理”不适用于sql组件的“ outputType = StreamList”

时间:2019-03-14 12:54:27

标签: apache-camel

在交易骆驼路线中,我需要:

  1. 调用oracle package 设置此 package 中变量的值;
  2. 执行sql语句,该语句使用 package ;
  3. 中的变量

请注意,包变量仅在设置它的连接中可见-因此,我需要在此处使用“事务处理”。

以下是演示该问题的示例代码:

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

如果我从sql中删除“ StreamList”选项并取消注释“ .transacted()”: GET_V1 = 10

问题:“事务处理”不能与sql组件的“ StreamList”选项一起使用吗?

其他信息:

如果我在多个线程中从路由上方开始,就像这样:

                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 :(得分:0)

如果仅用于同一数据库,则不需要XA事务transacted() 通常会交换不同的资源,例如一个JMS,另一个数据库

答案 1 :(得分:0)

您能告诉我们如何定义transactionManager吗?特别是,您是否将此txManager绑定到了数据源?

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="generalDataSource"/>
</bean>