Hello.

I have a JavaFX app that uses Spring to instantiate a number of services and presentation controllers. I think it's relevant to mention that among other services there's Jetty, an embedded web server that starts listening to a socket with its own threads. The Spring ApplicationContext is initialized in background after init() is called; and it also uses applicationContext.registerShutdownHook(). When I run the application in development mode (with Maven, from the terminal) or I launch the Java stub inside the bundled .app from the terminal (so the process is bound to the terminal) and I hit Ctrl-C, the application properly quits (with the Spring Application Context properly shutting down everything). When I launch the bundled .app and I press Cmd-Q, the window closes, but the application lingers somewhere (e.g. I see it in running processes). I have to "force quit" it. Platform.setImplicitExit(true) doesn't make any difference.

I expected that Cmd-Q called System.exit() and the Spring ApplicationContext just had its opportunity to orderly quit thanks to the shutdown hook. Instead, I see that the ApplicationContext stays alive and probably the threads started by some services keep the application running.

I've found that this solution works:

stage.setOnCloseRequest(new EventHandler<WindowEvent>()
  {
    @Override
    public void handle (final @Nonnull WindowEvent event)
      {
        applicationContext.close();
      }
  });

For me it's fine, but I'd like to understand whether this is the correct behaviour, or I'm doing something wrong, or there's a bug somewhere.

Details: JDK 1.7.0_25 with its embedded JavaFX runtime, Mac OS X 10.8.4. Sources fully available if needed.

Thanks.

--
Fabrizio Giudici - Java Architect @ Tidalwave s.a.s.
"We make Java work. Everywhere."
http://tidalwave.it/fabrizio/blog - fabrizio.giud...@tidalwave.it

Reply via email to