LISTEN / NOTIFY pgconnection geht java runter?

8

Ich verwende PostgreSQL DB und wende seine LISTEN/NOTIFY -Funktionalität an. Also ist mein Listener auf meinem AS (Application Server) und ich habe Trigger in meiner Datenbank konfiguriert, so dass wenn CRUD-Operationen an einer Tabelle durchgeführt werden, eine NOTIFY Anfrage an AS gesendet wird.

LISTENER -Klasse in Java:

%Vor%

So wie mein AS ist, habe ich konfiguriert, dass beim Start die Listener-Klasse aufgerufen wird ( @Startup annotation ) und es beginnt auf den Kanal zu hören.

Nun funktioniert das gut, wenn ich zB zum Testen meine Tabelle manuell in der DB bearbeite, die Benachrichtigung wird generiert und der LISTENER erhält sie.

Wenn ich jedoch programmgesteuert eine UPDATE-Anfrage an die Tabelle sende, wird die UPADTE erfolgreich ausgeführt, aber LISTENER empfängt nichts.

Ich fühle, dass meine Verbindung des LISTENERS ausfällt, wenn ich eine Anfrage sende (es stellt auch eine Verbindung her, um Entitäten zu bearbeiten), aber ich bin mir nicht sicher. Ich lese über permanente Verbindungen und gepoolte Verbindungen, aber nicht in der Lage zu entscheiden, wie das zu verfolgen ist.

Ich verwende pgjdbc ( Ссылка ) jar für Async-Benachrichtigungen, da jdbc-Verbindung Abfragen erfordert.

BEARBEITEN:

Wenn ich den obigen Listener mit dem Polling unter Verwendung des Standardjdbc-Jars (nicht pgjdbc) versuche, erhalte ich die Benachrichtigungen.

Ich tue es  %Code% und ich bekomme Benachrichtigungen, aber asynchron wie unten zu tun bekomme ich keine Benachrichtigungen.

%Vor%

Gelöst:

Mein Listener ging nach der Ausführung der Funktion aus dem Gültigkeitsbereich heraus , da mein Listener den Funktionsumfang hatte. Also habe ich es in eine Member-Variable meiner Startup-Bean-Klasse gehalten und dann hat es geklappt.

    
Siddharth Trikha 20.06.2016, 07:10
quelle

1 Antwort

5

Die Benachrichtigungs-Listener werden von dieser Bibliothek intern als schwache Referenzen verwaltet, was bedeutet, dass Sie eine externe Referenz festhalten müssen, damit sie nicht unbemerkt gesammelt werden. Überprüfen Sie die BasicContext-Klassenzeilen 642 - 655:

%Vor%

Wenn der GC den Listener aufnimmt, gibt der Aufruf von "get" auf der schwachen Referenz null zurück und wird nicht ausgelöst, wie in den Zeilen 690 - 710 zu sehen ist

%Vor%

Um dies zu beheben, fügen Sie Ihre Benachrichtigungs-Listener wie folgt hinzu:

%Vor%

Ein ziemlich seltsamer Anwendungsfall für schwache Referenzen meiner Meinung nach ...

    
Luke A. Leber 24.06.2016, 01:38
quelle