sql >> Base de Datos >  >> RDS >> PostgreSQL

ESCUCHAR/NOTIFICAR pgconnection deja de ser java?

Esa biblioteca mantiene internamente a los detectores de notificaciones como referencias débiles, lo que significa que debe mantener una referencia dura externamente para que no se recolecten basura. Consulte las líneas de clase BasicContext 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));
    }

}

Si el GC capta a su oyente, las llamadas para "obtener" en la referencia débil devolverán un valor nulo y no se dispararán como se ve en las líneas 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);
      }

    }

}

Para solucionar esto, agregue sus oyentes de notificación como tales:

/// 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);

En mi opinión, un caso de uso bastante extraño para referencias débiles...