如何从Camel路由中的bean访问SQL连接?

时间:2014-06-19 17:53:18

标签: apache-camel

我将数据插入到多个表中,并使用mybatis组件来执行此操作。我还需要在插入数据之前创建一个临时表。高级概述是:

  1. 获取要插入的数据
  2. 创建临时表
  3. 将数据插入临时表
  4. 插入table1从临时表中选择x
  5. 插入表2,从​​临时表
  6. 中选择y

    步骤2到5应该是他们自己的单个事务,以防出现故障。我目前得到了这个:

    from(initialEndpoint)
            .routeId("database-appender")
            .aggregate().expression(constant(true)).completionSize(100).aggregationStrategy(new LinkListAggregator())
            .transacted()
                .bean(CreateTmpLinksTable.class)
                .to("mybatis:prepareLinks?executorType=reuse&statementType=InsertList")
                .to("mybatis:insertLinks?executorType=reuse&statementType=InsertList")
                .to("mybatis:insertLinkSources?executorType=reuse&statementType=InsertList")
            .end()
            .log("Wrote at most ${body.size} links to the database")
    

    CreateTmpLinksTable需要有权访问当前连接,这样临时表的创建不会发生在不同的事务中(如果重要的话,以PostgreSQL为目标)。

    我目前有这个:

    public class CreateTmpLinksTable {
        public void createImportTable(Exchange exchange) throws SQLException {
            final Connection conn = exchange.getIn().getHeader("TransactionConnection", Connection.class);
            try (final Statement stat = conn.createStatement()) {
                stat.execute("CREATE TEMPORARY TABLE tmp_links(" +
                        "url text, hostname text, service media, service_id bigint, user_id bigint, screen_name text, harvested_at timestamp with time zone, body text" +
                        ") ON COMMIT DROP");
            }
        }
    }
    

    我也没有设置我的交易经理。我怀疑是我必须抓住交易管理员才能正确参与交易。

    问题:

    1. 如何从常规bean获取事务管理器?这只是获取上下文的问题,然后从上下文中获取经理通过注册表吗?

    2. 有没有更好的方法来做我需要的?我至少可以看到一个:将所有职责转移到一个bean中并在那里完成工作。还有其他方法吗?

    3. 注意:我正在学习Camel,我喜欢只用代码做事。一旦我知道所有内容是如何连接的,那么我就可以将这些知识传递给Spring。

1 个答案:

答案 0 :(得分:0)

Q1, 如果你可以将bean的实例传递给camel路由,你可以自己设置事务管理器,否则你必须使用注册表来查找事务管理器实例。

Q2, 如果您需要管理其他资源,可以将数据库更新工作包装在单个bean中,并在camel中使用事务处理的DSL。