sql >> Databáze >  >> RDS >> PostgreSQL

POSLOUCHEJTE/UPOZORŇUJTE pgconnection spadne java?

Posluchače oznámení jsou interně udržovány touto knihovnou jako slabé reference, což znamená, že musíte externě uchovávat pevnou referenci, aby nebyly shromažďovány odpadky. Podívejte se na řádky třídy 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));
    }

}

Pokud GC zachytí váš posluchač, volání "get" na slabé referenci vrátí hodnotu null a nespustí se, jak je vidět z řádků 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);
      }

    }

}

Chcete-li to vyřešit, přidejte své posluchače oznámení jako takové:

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

Podle mého názoru je to docela zvláštní případ použití pro slabé reference...




  1. Jak aktualizovat sloupec MYSQL, pokud hodnota existuje v jiné tabulce?

  2. MySQL LAST_INSERT_ID() používané s příkazem INSERT s více záznamy

  3. Manipulace se smyčkou a seskupování MYSQL PHP hodnot

  4. Codeigniter zobrazuje prázdnou stránku bez chyby