3.5. 非同期通知

Postgresは、LISTENNOTIFYコマンドによる非同期通知機能をサポートしています。 バックエンドはLISTENコマンドを受け取ると、 特定のセマフォへ関心を持ったことを登録します。名前のついた特定の セマフォを見ているすべてのバックエンドは、他のバックエンドによって同じ名前の NOTIFYコマンドが実行された時点で非同期的に通知されます。 ただし通知の発行側から受信側へ渡される付加的な情報はありません。 したがって、典型的にはリレーションを通じ、両者の間で交換すべき実際のデータを 転送することになります。

Note: 以前のドキュメントは、非同期通知に使う名前とリレーション(クラス)を関連する ものとしていました。しかし現実には、実装がこの二つの概念を直接結び付けている 部分は何ひとつありません。そして以前定義していたように、名前付きセマフォが 対応するリレーションを持つ必要性も実際にはありません。

接続しているバックエンドが非同期通知を受けるたびに、 libpq++アプリケーションもその通知を受けます。 しかしバックエンドからフロントエンドへの通信は非同期的なものではありません。 libpq++アプリケーションは保留中の通知情報がないかどうか 確認するために、バックエンドへのポーリングをしなければならないのです。 フロントエンドはPgDatabase::Notifiesを問い合わせ実行の 後に呼び出し、その時点でバックエンドから通知データが届いていないか 確認することができます。PgDatabase::Notifies はバックエンドから届いた通知の未処理分リストから、ひとつ通知を返します。 バックエンドからの通知が何も保留されていなければ、この関数はNULLを返します。 PgDatabase::Notifiesの動作はスタックのポップの ようなものです。いったんPgDatabase::Notifiesが 通知を返すとその通知はもはや処理が済んだものとみなされ、 通知リストから取り除かれます。

なお、二番目のサンプルプログラムが非同期通知を使用した例です。