From 282b85b5e7a7aa4f5ee4f30ac1b9cc0a7e95031e Mon Sep 17 00:00:00 2001 From: Heesung Sohn Date: Tue, 13 Aug 2024 10:25:02 -0700 Subject: [PATCH 1/2] [pip] PIP-371 Support to specify message listeners in TableView constructor --- pip/pip-369.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 pip/pip-369.md diff --git a/pip/pip-369.md b/pip/pip-369.md new file mode 100644 index 0000000000000..d0e569ba0327c --- /dev/null +++ b/pip/pip-369.md @@ -0,0 +1,89 @@ +# PIP-371: Support to specify message listeners in TableView constructor + +# Background knowledge + +### TableView +Ref: https://pulsar.apache.org/docs/next/concepts-clients/#tableview + +### TableView Listeners +TableView runs the registered listeners on each received message. TableView users could utilize TableView Listeners for event-sourcing applications. + +### How to Register TableView Listeners + +Currently, `TableView#foreachAndListen` and `TableView#listen` interfaces are used to register listeners. + +# Motivation +issue : https://github.com/apache/pulsar/issues/23158 + +As reported in the above issue, currently, the TableView listener registration methods, `foreachAndListen` and `listen`, are being called after `TableView#start()`. This timing issue can result in some messages being missed or not handled if the listeners are registered too late. + +Additionally, the current implementation of these listeners does not distinguish between existing messages (those present before the TableView started) and tail (future) messages (those received after the TableView started). Some business logic may require different handling for these two types of messages, but the current design does not support this differentiation. + + + +# Goals + +## In Scope + +- Support specifying TableView Listeners in TableView builder and constructor, so that TableView can register listeners as part of instance init and accordingly call them for all messages. +- Support specifying TableView Listeners for existing and tail messages separately. +- This design is based on Pulsar-Java-Client. + +# Detailed Design + +## Design & Implementation Details + +Add followings in TableViewBuilder.java +```java + /** + * Set the message listeners. + * If {@link TableViewBuilder#existingMessageListeners} are not specified, + * these listeners are used for both + * existing and tailing(future) messages in the topic. + * @param listeners message listeners + * @return the {@link TableViewBuilder} builder instance + */ + TableViewBuilder messageListeners(BiConsumer... listeners); + + /** + * Set the message listeners separately for existing messages in the topic. + * @param listeners message listeners + * @return the {@link TableViewBuilder} builder instance + */ + TableViewBuilder existingMessageListeners(BiConsumer... listeners); + +``` + + +Add followings in TableViewConfigurationData.java +```java + private BiConsumer[] messageListeners; + private BiConsumer[] existingMessageListeners; +``` + +Add followings in TableViewImpl.java +```java +private final List> existingMessageListeners; +``` + +Update followings in TableViewImpl.java +```java + +// before +private void handleMessage(Message msg) +// after +private void handleMessage(Message msg, boolean handleExistingMessage) + +``` + +# Backward & Forward Compatibility + +Compatible. + +# Links + + +* Mailing List discussion thread: +* Mailing List voting thread: From 1ae51174da20820db4f489141e99b5013654ce3b Mon Sep 17 00:00:00 2001 From: Heesung Sohn Date: Wed, 14 Aug 2024 10:06:04 -0700 Subject: [PATCH 2/2] renamed the file --- pip/{pip-369.md => pip-373.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pip/{pip-369.md => pip-373.md} (100%) diff --git a/pip/pip-369.md b/pip/pip-373.md similarity index 100% rename from pip/pip-369.md rename to pip/pip-373.md