+ @Override
+ public final void start() throws Exception {
+ ExecutorService es = Executors.newSingleThreadExecutor();
+ Future<?> app = es.submit(this);
+ final AbsServiceStarter<?,?> absSS = this;
+ // Docker/K8 may separately create startup Status in this dir for startup
+ // sequencing. If so, delete ON EXIT
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ @Override
+ public void run() {
+ absSS.access().printf(Level.INIT, "Shutting down %s:%s\n",absSS.service.app_name, absSS.service.app_version);
+ absSS.shutdown();
+ app.cancel(true);
+ }
+ });
+ if(System.getProperty("ECLIPSE", null)!=null) {
+ Thread.sleep(2000);
+ if(!app.isCancelled()) {
+ System.out.println("Service Started in Eclipse: ");
+ System.out.print(" Hit <enter> to end:\n");
+ try {
+ System.in.read();
+ System.exit(0);
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+
+ @SafeVarargs
+ public final synchronized void register(final Registrant<ENV> ... registrants) {
+ if (do_register) {
+ if (registrar==null) {
+ registrar = new Registrar<ENV>(env(),false);
+ }
+ for (Registrant<ENV> r : registrants) {
+ registrar.register(r);
+ }
+ }
+ }