我将数据插入到多个表中,并使用mybatis组件来执行此操作。我还需要在插入数据之前创建一个临时表。高级概述是:
步骤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");
}
}
}
我也没有设置我的交易经理。我怀疑是我必须抓住交易管理员才能正确参与交易。
问题:
如何从常规bean获取事务管理器?这只是获取上下文的问题,然后从上下文中获取经理通过注册表吗?
有没有更好的方法来做我需要的?我至少可以看到一个:将所有职责转移到一个bean中并在那里完成工作。还有其他方法吗?
注意:我正在学习Camel,我喜欢只用代码做事。一旦我知道所有内容是如何连接的,那么我就可以将这些知识传递给Spring。
答案 0 :(得分:0)
Q1, 如果你可以将bean的实例传递给camel路由,你可以自己设置事务管理器,否则你必须使用注册表来查找事务管理器实例。
Q2, 如果您需要管理其他资源,可以将数据库更新工作包装在单个bean中,并在camel中使用事务处理的DSL。