Listen and Notify provide a simple form of signal or interprocess communication mechanism for a collection of processes accessing the same LightDB database. For more information on notifications consult the main server documentation. This section only deals with the JDBC specific aspects of notifications.
Standard LISTEN
, NOTIFY
, and
UNLISTEN
commands are issued via the standard
Statement
interface. To retrieve and process retrieved
notifications the Connection
must be cast to the LightDB
specific extension interface PGConnection
. From there the
getNotifications()
method can be used to retrieve any
outstanding notifications.
A key limitation of the JDBC driver is that it cannot receive asynchronous notifications and must poll the backend to check if any notifications were issued. A timeout can be given to the poll function, but then the execution of statements from other threads will block.
Example 9.2. Receiving Notifications
import java.sql.*;
public class NotificationTest
{
public static void main(String args[]) throws Exception
{
Class.forName("com.hundsun.lightdb.Driver");
String url = "jdbc:lightdb://localhost:5432/test";
// Create two distinct connections, one for the notifier
// and another for the listener to show the communication
// works across connections although this example would
// work fine with just one connection.
Connection lConn = DriverManager.getConnection(url,"test","");
Connection nConn = DriverManager.getConnection(url,"test","");
// Create two threads, one to issue notifications and
// the other to receive them.
= new Listener(lConn);
Listener listener = new Notifier(nConn);
Notifier notifier .start();
listener.start();
notifier}
}
class Listener extends Thread
{
private Connection conn;
private org.postgresql.PGConnection pgconn;
Listener(Connection conn) throws SQLException
{
this.conn = conn;
this.pgconn = conn.unwrap(org.postgresql.PGConnection.class);
Statement stmt = conn.createStatement();
.execute("LISTEN mymessage");
stmt.close();
stmt}
public void run()
{
try
{
while (true)
{
.postgresql.PGNotification notifications[] = pgconn.getNotifications();
org
// If this thread is the only one that uses the connection, a timeout can be used to
// receive notifications immediately:
// org.postgresql.PGNotification notifications[] = pgconn.getNotifications(10000);
if (notifications != null)
{
for (int i=0; i < notifications.length; i++)
System.out.println("Got notification: " + notifications[i].getName());
}
// wait a while before checking again for new
// notifications
Thread.sleep(500);
}
}
catch (SQLException sqle)
{
.printStackTrace();
sqle}
catch (InterruptedException ie)
{
.printStackTrace();
ie}
}
}
class Notifier extends Thread
{
private Connection conn;
public Notifier(Connection conn)
{
this.conn = conn;
}
public void run()
{
while (true)
{
try
{
Statement stmt = conn.createStatement();
.execute("NOTIFY mymessage");
stmt.close();
stmtThread.sleep(2000);
}
catch (SQLException sqle)
{
.printStackTrace();
sqle}
catch (InterruptedException ie)
{
.printStackTrace();
ie}
}
}
}