[GENERAL] JDBC: logical replication and LSN feedback - Mailing list pgsql-general

From Yason TR
Subject [GENERAL] JDBC: logical replication and LSN feedback
Date
Msg-id trinity-3e0e6193-3a88-442e-9b4f-1366a43c68f3-1505828251806@3c-app-mailcom-bs15
Whole thread Raw
Responses Re: [GENERAL] JDBC: logical replication and LSN feedback
List pgsql-general
Hi all,

I am developing an application which connects to a logical replication slot, to consume the WAL events. These WAL
eventsare then forwarded to a MQ broker.
 

The heart of the code can be seen as:

while (true) {   Connection connection = null;   PGReplicationStream stream = null;
   try {       connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db", properties);
stream=
connection.unwrap(PGConnection.class).getReplicationAPI().replicationStream().logical().withSlotName("slot").start();
       while (true) {           final ByteBuffer buffer = stream.read();
           // ... MQ logic here ... omitted ...
           stream.setAppliedLSN(stream.getLastReceiveLSN());
stream.setFlushedLSN(stream.getLastReceiveLSN());      }   } catch (final SQLException e) {       // ... log exception
...omitted ...   } finally {       // ... close stream and connection ... omitted ...   }
 
}

I notice some behavior which I cannot explain and would like to understand so I can alter my code:

- When I restart the application, I notice that the application is retrieving the last event from the previous run
again.The result is that this event is sent twice to the MQ broker after a restart of the application. Why is that?
Isn'tcalling `setAppliedLSN(stream.getLastReceiveLSN())` and/or `setFlushedLSN(stream.getLastReceiveLSN())` enough to
acknowledgean event, so it will removed from the WAL log and it will not be resent?
 

- When receiving an event, the corresponding LSN from that event (which is sent in the payload) is not the same as the
resultof `stream.getLastReceivedLSN()`. Why is that? Which one should I use? Maybe this is correlated to my first
question.

- What is the difference between `setAppliedLSN(LSN)` and `setFlushedLSN(LSN)`? The Javadocs are not really helpful
here.

FYI, I also asked this question on
https://stackoverflow.com/questions/46301578/postgres-jdbc-logical-replication-lsn-feedback.

Thanks a lot and kind regards,

Yason TR


-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

pgsql-general by date:

Previous
From: "Yason TR"
Date:
Subject: [GENERAL]
Next
From: Job
Date:
Subject: [GENERAL] Insert large number of records