Я использую JOOQ в бэкэндовых веб-сервисах некоторое время. Во многих из этих сервисов, после сохранения данных в базе данных (или, лучше сказать, после успешной передачи данных), мы обычно хотим написать некоторые сообщения Кафке о сохраненных записях, чтобы другие службы знали об этих событиях.Заключительный крюк в JOOQ
Что я, по сути, ищу, есть: есть ли способ зарегистрировать привязку или обратный вызов после коммита с объектом JQQ DSLContext
, поэтому я могу запустить некоторый код, когда транзакция успешно завершится?
Я знаю интерфейсов ExecuteListener
и ExecuteListenerProvider
, но, насколько я могу сказать void end(ExecuteContext ctx)
метод (который, предположительно, для завершения жизненного цикла используется) не вызывается при совершении сделки. Он вызывается после каждого запроса.
Вот пример:
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();
}
Который всегда кажется печати:
Pre insert.
End method triggered.
Post insert.
Делать мне поверить, что это не предназначено для фиксации крючков.
Возможно, есть гуру JOOQ, который может сказать мне, есть ли поддержка для фиксации крюков в JOOQ? И если так, укажите меня в правильном направлении?
Попробуйте комбинировать 'TransactionProvider',' RecordListener' и 'ExecuteListener'. Вы могли бы записывать записи c/u/d в поток локально и либо отбрасывать, либо публиковать в зависимости от завершения самой внешней транзакции. –