2017-11-13 4 views
1

Ich versuche, eine Aufgabe automatisch auszuführen (alle 30s).Singleton, kann nicht in der ausführbaren Aufgabe gehen

Dafür baute ich ein Singleton:

public class PortalSingleton { 
    private static final Logger LOG = LoggerFactory.getLogger(PortalSingleton.class); 
    private static final int INITIAL_DELAY = 0; 
    private static final int DELAY = 30; 

    private static volatile ScheduledExecutorService instance; 
    private static HomepageView homeView = new HomepageView(); 

    private PortalSingleton() {} 

    public static final void refreshGridHomePageAutomatically() { 
     Runnable task =() -> UI.getCurrent().access(() -> { 
      homeView.refreshGrid(); 
      LOG.info("The grid has been refreshed Automatically"); 
     }); 
     getInstance().scheduleWithFixedDelay(task, INITIAL_DELAY, DELAY, TimeUnit.SECONDS); 
    } 

    public final static ScheduledExecutorService getInstance() { 
     if (instance == null) { 
      synchronized (ScheduledExecutorService.class) { 
       if (instance == null) { 
        instance = Executors.newScheduledThreadPool(1); 
       } 
      } 
     } 
     return instance; 
    } 
} 

Aber ich hatte keine Problem/Fehler und ich habe nicht mein log msg und mein Gitter hat nicht aufgefrischt worden ..

Das Verhalten erwarten:

  1. mein Raster aktualisieren
  2. das Protokoll msg
  3. sehen

Auch wenn ich die Linie homeView.refreshGrid();, löschen Ich habe nicht mein Log msg ...

Was habe ich falsch gemacht?

Danke,

EDIT: Ich nenne es, indem Sie: PortalSingleton.refreshGridHomePageAutomatically();

EDIT2 dank @Holger:

public class PortalSingleton { 
    private static final Logger LOG = LoggerFactory.getLogger(PortalSingleton.class); 
    private static final int INITIAL_DELAY = 0; 
    private static final int DELAY = 30; 

    private static final ScheduledExecutorService instance = Executors.newScheduledThreadPool(1); 
    private static HomepageView homeView = new HomepageView(); 

    private PortalSingleton() { 
    } 

    public static final void refreshGridHomePageAutomatically() { 
     Runnable task =() -> UI.getCurrent().access(() -> { 
      homeView.refreshGrid(); 
      LOG.info("The grid has been refreshed Automatically"); 
     }); 
     try { 
      getInstance().scheduleWithFixedDelay(task, INITIAL_DELAY, DELAY, TimeUnit.SECONDS); 
     } catch (Exception e) { 
      LOG.error("error" + e); 
     } 
    } 

    public final static ScheduledExecutorService getInstance() { 
     return instance; 
    } 
} 
+0

nicht beschweren .. Ich erwarte zu sehen msg "Das Gitter wurde automatisch aktualisiert" und meine Gitter aktualisiert, aber ich habe nicht das erwartete Verhalten. Also ich verstehe nicht, was ich falsch gemacht habe, denn ich habe keinen Fehler msg ... – Bob

+0

@Holger, habe ich meinen Beitrag bearbeitet, ist es klarer? – Bob

+0

Danke für Ihre Hilfe! Ich habe versucht, try/catch (siehe EDIT2 in meinem Post) für den ScheduledExecutorService zu verwenden. Ich nahm an, dass das nicht gut ist, weil ich keinen Fehler habe und immer noch nicht das erwartete Verhalten habe. – Bob

Antwort

2

Wenn Sie eine Aktion planen, erhalten Sie nicht eine Rückmeldung, wenn ein Ausnahme tritt auf. Stattdessen wird es nur um es ausführen stoppen:

ScheduledExecutorService.scheduleWithFixedDelay(…):

... Wenn eine Ausführung der Aufgabe, eine Ausnahme trifft, werden die nachfolgenden Ausführungen unterdrückt.

Daher müssen Sie einen try … catch Block in der Aktion selbst verwenden, um es zu melden, z. in der Lambda-Ausdruck Definition Ihrer Runnable:

Runnable task =() -> { 
    try { UI.getCurrent().access(…); } 
    catch (Exception e) { LOG.error("error" + e); } 
}; 

Es sieht für mich verdächtig, dass Sie UI.getCurrent() aus einem Nicht-UI-Thread aufrufen, die ich vermute, null zurück ein NullPointerException zu verursachen, wenn ein Verfahren auf sie aufzurufen versuchen.

+0

Ja, Sie haben vollkommen recht: Ich sollte die UI.getCurrent() nicht aufrufen, ich habe sie gelöscht. Ich bin nicht in einer Benutzeroberfläche. Wenn ich debugge, habe ich keine NPE auf UI.getCurrent(), aber die NPE erscheint mit dem Try/Catch Danke nochmal für deine Hilfe! – Bob

Verwandte Themen