Usando pg_notify na função de gatilho do PostgreSQL

Estou tentando emitir uma notificação de uma função de gatilho do PostgreSQL. Posso usar com sucesso o comando NOTIFY, mas não estou tendo sorte com o pg_notify. Mesmo que eu receba uma notificação quando chamo a função pg_notify no console psql, nunca recebo uma notificação quando chamo o mesmo da minha função de dispar

Esta versão da minha função de gatilho funciona conforme o esperad Eu tenho um programa Java que está ouvindo 'mymessage' e ele recebe uma notificação com uma carga útil 'acionada por NOTIFY'.

-- Function: conversation_notify()

-- DROP FUNCTION conversation_notify();

CREATE OR REPLACE FUNCTION conversation_notify()
  RETURNS trigger AS
$BODY$
    BEGIN
        --SELECT pg_notify('mymessage', 'fired by FUNCTION');
        NOTIFY mymessage, 'fired by NOTIFY';
        RETURN NULL;
    END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION conversation_notify() OWNER TO postgres;

Esta versão da minha função de disparo NÃO funciona conforme o esperad As únicas alterações são descomentar a linha pg_notify e comentar a linha NOTIFY abaixo. (Não modifiquei o aplicativo Java que está LISTENing.) Espero que meu aplicativo LISTENing para 'mymessage' receba uma notificação com uma carga útil 'acionada por FUNCTION'. O comportamento real é que nada é recebido, nem mais de 30 segundos após a modificação da tabela correspondent

-- Function: conversation_notify()

-- DROP FUNCTION conversation_notify();

CREATE OR REPLACE FUNCTION conversation_notify()
  RETURNS trigger AS
$BODY$
    BEGIN
        SELECT pg_notify('mymessage', 'fired by FUNCTION');
        --NOTIFY mymessage, 'fired by NOTIFY';
        RETURN NULL;
    END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION conversation_notify() OWNER TO postgres;

No entanto, eu sourealment confuso, porque o mesmo comando pg_notify funciona conforme o esperado no console psq Quando executo o seguinte comando, meu aplicativo Java recebe uma notificação com uma carga útil 'acionada pelo CONSOLE':

select pg_notify('mymessage', 'fired by CONSOLE');

Para completar, eis a minha definição de gatilho:

-- Trigger: conversation_notify on ofconversation

-- DROP TRIGGER conversation_notify ON ofconversation;

CREATE TRIGGER conversation_notify
  AFTER INSERT OR UPDATE
  ON ofconversation
  FOR EACH ROW
  EXECUTE PROCEDURE conversation_notify();

Estou tentando usar o pg_notify porque gostaria de ter uma carga útil dinâmica. Agora, esse é um ponto discutível. :) O manual do Postgres 9.0 indica que isso deve ser possível.Os documentos NOTIFY para o estado do parâmetro 'payload':

(Se dados binários ou grandes quantidades de informação precisarem ser comunicadas, é melhor colocá-lo em uma tabela de banco de dados e enviar a chave do registro.)

Também referenciei uma pergunta relacionada ao Stack Overflow e acho que me esquivei desse problema: LISTEN / NOTIFY usando pg_notify (texto, texto) no PostgreSQL.

A versão do banco de dados é:

PostgreSQL 9.0.3, compilado pelo Visual C ++ build 1500, 32 bits

Meu SO é o Windows XP Professional, versão 2002, SP

Desde já, obrigado

EDIT: Adicionado meu código de ouvinte Java abaixo. É baseado neste exemplo dos documentos do PostgreSQL:http: //jdbc.postgresql.org/documentation/81/listennotify.htm.

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.postgresql.PGConnection;
import org.postgresql.PGNotification;

public class ConversationListener extends Thread
{   
    private Connection conn;
    private PGConnection pgConn;

    public ConversationListener(Connection conn) throws SQLException
    {
        this.conn = conn;
        this.pgConn = (PGConnection) conn;
        Statement listenStatement = conn.createStatement();
        listenStatement.execute("LISTEN mymessage");
        listenStatement.close();
    }

    @Override
    public void run()
    {
        while (true)
        {
            try
            {
                // issue a dummy query to contact the backend
                // and receive any pending notifications.
                Statement selectStatement = conn.createStatement();
                ResultSet rs = selectStatement.executeQuery("SELECT 1");
                rs.close();
                selectStatement.close();

                PGNotification notifications[] = pgConn.getNotifications();

                if (notifications != null)
                {
                    for (PGNotification pgNotification : notifications)
                    {
                        System.out.println("Got notification: " + pgNotification.getName() +
                            " with payload: " + pgNotification.getParameter());
                    }
                }

                // wait a while before checking again
                Thread.sleep(500);
            }
            catch (SQLException sqlException)
            {
                sqlException.printStackTrace();
            }
            catch (InterruptedException ie)
            {
                ie.printStackTrace();
            }
        }
    }
}

Este é um aplicativo de desktop Java 1.6 SE simples, por isso estou gerenciando minha própria conexão JDBC e tudo mais. Estou carregando o driver via

Class.forName("org.postgresql.Driver");

Estou usando a biblioteca postgresql-9.0-801.jdbc3.jar (apenas uma no meu caminho de classe) e o JDK 1.6.0_2

Apenas para recapitular de cima, o código Java funciona bem com NOTIFY do psql e o gatilho, e com pg_notify do psq

questionAnswers(6)

yourAnswerToTheQuestion