Top Description Methods
org.postgresql.replication

public Interface PGReplicationStream

extends AutoCloseable
Known Direct Implementers
org.postgresql.core.v3.replication.V3PGReplicationStream
Imports
org.postgresql.replication.fluent.CommonOptions, org.postgresql.replication.fluent.logical.LogicalReplicationOptions, org.checkerframework.checker.nullness.qual.Nullable, java.nio.ByteBuffer, java.sql.SQLException

Not tread safe replication stream (though certain methods can be safely called by different threads). After complete streaming should be close, for free resource on backend. Periodical status update work only when use PGReplicationStream#read() method. It means that process wal record should be fast as possible, because during process wal record lead to disconnect by timeout from server.

Method Summary

Modifier and TypeMethod and Description
public void
close()

Redeclares java.lang.AutoCloseable.close.

Stop replication changes from server and free resources.

public void
forceUpdateStatus()

Force send last received, flushed and applied LSN status to backend.

public LogSequenceNumber

Returns:

not null location of the last WAL applied in the standby.
getLastAppliedLSN
()

Last applied lsn sent in update message to backed.

public LogSequenceNumber

Returns:

NOT NULL location of the last WAL flushed to disk in the standby.
getLastFlushedLSN
()

Last flushed LSN sent in update message to backend.

public LogSequenceNumber

Returns:

NOT NULL LSN position that was receive last time via PGReplicationStream#read() method
getLastReceiveLSN
()

Parameter updates by execute PGReplicationStream#read() method.

public boolean

Returns:

true if replication stream was already close, otherwise return false
isClosed
()

public @Nullable ByteBuffer

Returns:

not null byte array received by replication protocol, return ByteBuffer wrap around received byte array with use offset, so, use ByteBuffer#array() carefully
read
()

Read next wal record from backend.

public @Nullable ByteBuffer

Returns:

byte array received by replication protocol or NULL if pending message from server absent. Returns ByteBuffer wrap around received byte array with use offset, so, use ByteBuffer#array() carefully.
readPending
()

Read next WAL record from backend.

public void
setAppliedLSN(LogSequenceNumber
NOT NULL location of the last WAL applied in the standby.
applied
)

Inform backend which LSN has been applied on standby.

public void
setFlushedLSN(LogSequenceNumber
NOT NULL location of the last WAL flushed to disk in the standby.
flushed
)

Set flushed LSN.

Method Detail

closeback to summary
public void close() throws SQLException

Redeclares java.lang.AutoCloseable.close.

Stop replication changes from server and free resources. After that connection can be reuse to another queries. Also after close current stream they cannot be used anymore.

Note

This method can spend much time for logical replication stream on postgresql version 9.6 and lower, because postgresql have bug - during decode big transaction to logical form and during wait new changes postgresql ignore messages from client. As workaround you can close replication connection instead of close replication stream. For more information about it problem see mailing list thread Stopping logical replication protocol

Annotations
@Override
Exceptions
SQLException:
when some internal exception occurs during end streaming
forceUpdateStatusback to summary
public void forceUpdateStatus() throws SQLException

Force send last received, flushed and applied LSN status to backend. You cannot send LSN status explicitly because PGReplicationStream sends the status to backend periodically by configured interval via LogicalReplicationOptions#getStatusInterval

Exceptions
SQLException:
when some internal exception occurs during read from stream
See Also
LogicalReplicationOptions#getStatusInterval()
getLastAppliedLSNback to summary
public LogSequenceNumber getLastAppliedLSN()

Last applied lsn sent in update message to backed. Parameter updates only via PGReplicationStream#setAppliedLSN(LogSequenceNumber)

It is safe to call this method in a thread different than the main thread.

Returns:LogSequenceNumber

not null location of the last WAL applied in the standby.

getLastFlushedLSNback to summary
public LogSequenceNumber getLastFlushedLSN()

Last flushed LSN sent in update message to backend. Parameter updates only via PGReplicationStream#setFlushedLSN(LogSequenceNumber)

It is safe to call this method in a thread different than the main thread.

Returns:LogSequenceNumber

NOT NULL location of the last WAL flushed to disk in the standby.

getLastReceiveLSNback to summary
public LogSequenceNumber getLastReceiveLSN()

Parameter updates by execute PGReplicationStream#read() method.

It is safe to call this method in a thread different than the main thread. However, usually this method is called in the main thread after a successful PGReplicationStream#read() or PGReplicationStream#readPending(), to get the LSN corresponding to the received record.

Returns:LogSequenceNumber

NOT NULL LSN position that was receive last time via PGReplicationStream#read() method

isClosedback to summary
public boolean isClosed()
Returns:boolean

true if replication stream was already close, otherwise return false

readback to summary
public @Nullable ByteBuffer read() throws SQLException

Read next wal record from backend. It method can be block until new message will not get from server.

A single WAL record is never split across two XLogData messages. When a WAL record crosses a WAL page boundary, and is therefore already split using continuation records, it can be split at the page boundary. In other words, the first main WAL record and its continuation records can be sent in different XLogData messages.

Returns:@Nullable ByteBuffer

not null byte array received by replication protocol, return ByteBuffer wrap around received byte array with use offset, so, use ByteBuffer#array() carefully

Exceptions
SQLException:
when some internal exception occurs during read from stream
readPendingback to summary
public @Nullable ByteBuffer readPending() throws SQLException

Read next WAL record from backend. This method does not block and in contrast to PGReplicationStream#read(). If message from backend absent return null. It allow periodically check message in stream and if they absent sleep some time, but it time should be less than CommonOptions#getStatusInterval() to avoid disconnect from the server.

A single WAL record is never split across two XLogData messages. When a WAL record crosses a WAL page boundary, and is therefore already split using continuation records, it can be split at the page boundary. In other words, the first main WAL record and its continuation records can be sent in different XLogData messages.

Returns:@Nullable ByteBuffer

byte array received by replication protocol or NULL if pending message from server absent. Returns ByteBuffer wrap around received byte array with use offset, so, use ByteBuffer#array() carefully.

Exceptions
SQLException:
when some internal exception occurs during read from stream
setAppliedLSNback to summary
public void setAppliedLSN(LogSequenceNumber applied)

Inform backend which LSN has been applied on standby. Feedback will send to backend on next update status iteration.

It is safe to call this method in a thread different than the main thread. The updated value will be sent to the backend in the next status update run.

Parameters
applied:LogSequenceNumber

NOT NULL location of the last WAL applied in the standby.

See Also
PGReplicationStream#forceUpdateStatus()
setFlushedLSNback to summary
public void setFlushedLSN(LogSequenceNumber flushed)

Set flushed LSN. This parameter will be sent to backend on next update status iteration. Flushed LSN position help backend define which WAL can be recycled.

It is safe to call this method in a thread different than the main thread. The updated value will be sent to the backend in the next status update run.

Parameters
flushed:LogSequenceNumber

NOT NULL location of the last WAL flushed to disk in the standby.

See Also
PGReplicationStream#forceUpdateStatus()