sql >> Database >  >> RDS >> PostgreSQL

LUISTEREN/MELDEN pgconnection gaat weg java?

De notificatielisteners worden intern door die bibliotheek onderhouden als zwakke referenties, wat inhoudt dat je een externe harde referentie moet hebben, zodat ze niet als afval worden verzameld. Bekijk de BasicContext klasse regels 642 - 655:

public void addNotificationListener(String name, String channelNameFilter, NotificationListener listener) {

    name = nullToEmpty(name);
    channelNameFilter = channelNameFilter != null ? channelNameFilter : ".*";

    Pattern channelNameFilterPattern = Pattern.compile(channelNameFilter);

    NotificationKey key = new NotificationKey(name, channelNameFilterPattern);

    synchronized (notificationListeners) {
      notificationListeners.put(key, new WeakReference<NotificationListener>(listener));
    }

}

Als de GC uw luisteraar oppikt, zullen oproepen om op de zwakke referentie te "krijgen" nul opleveren en niet worden geactiveerd zoals te zien is vanaf lijnen 690 - 710

  @Override
  public synchronized void reportNotification(int processId, String channelName, String payload) {

    Iterator<Map.Entry<NotificationKey, WeakReference<NotificationListener>>> iter = notificationListeners.entrySet().iterator();
    while (iter.hasNext()) {

      Map.Entry<NotificationKey, WeakReference<NotificationListener>> entry = iter.next();

      NotificationListener listener = entry.getValue().get();
      if (listener == null) {

        iter.remove();
      }
      else if (entry.getKey().channelNameFilter.matcher(channelName).matches()) {

        listener.notification(processId, channelName, payload);
      }

    }

}

Om dit op te lossen, voegt u uw notificatielisteners als volgt toe:

/// Do not let this reference go out of scope!
    PGNotificationListener listener = new PGNotificationListener() {

    @Override
    public void notification(int processId, String channelName, String payload) {
        // interesting code
    };
};
    pgConnection.addNotificationListener(listener);

Nogal een vreemde use-case voor zwakke referenties naar mijn mening...




  1. Converteer hex naar binair in MySQL

  2. Kan dynamische query niet uitvoeren in opgeslagen procedure tijdens het selecteren van het aantal records

  3. Toegang tot kolom van updatetabel in subquery in mysql

  4. PostgreSQL - query tegen GIN-index van HSORE-waarde