我已經在後端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記錄,並根據最外層事務的完成情況丟棄或發佈。 –