我已经在后端Web服务中使用JOOQ一段时间了。在许多这些服务中,在将数据保存到数据库之后(或者更好地说,在成功提交数据之后),我们通常希望向卡夫卡写入关于持久记录的一些消息,以便其他服务知道这些事件。JOOQ中的提交钩子
我基本上在寻找的是:有没有办法让我用JOOQ的DSLContext
对象注册post-commit钩子或回调,所以我可以在事务成功提交时运行一些代码?
我知道了ExecuteListener
和ExecuteListenerProvider
接口的,但据我可以告诉void end(ExecuteContext ctx)
方法(这是所谓的生命周期使用的结束)提交事务时不叫。它在每个查询之后都被调用。
下面是一个例子:让我相信这不是为commit钩子
Pre insert.
End method triggered.
Post insert.
:
public static void main(String[] args) throws Throwable {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection("<url>", "<user>", "<pass>");
connection.setAutoCommit(false);
DSLContext context = DSL.using(connection, SQLDialect.POSTGRES_9_5);
context.transaction(conf -> {
conf.set(new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
@Override
public void end(ExecuteContext ctx) {
System.out.println("End method triggered.");
}
}));
DSLContext innerContext = DSL.using(conf);
System.out.println("Pre insert.");
innerContext.insertInto(...).execute();
System.out.println("Post insert.");
});
connection.close();
}
这似乎总是打印。
有没有可能是一个JOOQ大师,可以告诉我,如果有支持JOOQ中的提交钩子?如果是这样,请指出我正确的方向?
尝试组合'TransactionProvider','RecordListener'和'ExecuteListener'。您可以在本地线程中捕获c/u/d记录,并根据最外层事务的完成情况丢弃或发布。 –