我试图从Postgresql触发器函数发出通知.我可以成功使用NOTIFY命令,但我没有运气与pg_notify.即使我从psql控制台调用pg_notify函数时收到一个通知,当从我的触发器函数调用相同的时候,我从来没有收到通知.
这个版本的触发器功能如预期的那样工作.我有一个Java程序,它被认为是’mymessage’,它收到一个通知,由“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;
这个版本的触发器功能不能像预期的那样工作.唯一的变化是取消注释pg_notify行,并注释掉下面的NOTIFY行. (我没有修改那个LISTENING的Java应用程序).我希望我的应用程序“mymessage”应该接收到一个“FUNCTION”有效载荷的通知.实际的行为是没有收到任何东西,甚至在相应的表修改30秒之后.
-- 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;
但是,我真的很困惑,因为同样的pg_notify命令可以像psql控制台一样工作!当我执行以下命令时,我的Java应用程序接收到一个通知,其中包含“由CONSOLE触发”的有效载荷:
select pg_notify('mymessage','fired by CONSOLE');
为了完整,这里是我的触发器定义:
-- 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();
我想使用pg_notify,因为我想要一个动态有效载荷.现在,这是一个假设.