Skip to content

Commit b36e046

Browse files
committed
onStart/onStop events fix jooby-project#289
1 parent 5eb5adf commit b36e046

File tree

2 files changed

+78
-11
lines changed

2 files changed

+78
-11
lines changed

jooby/src/main/java/org/jooby/Jooby.java

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -489,11 +489,6 @@ public EnvDep(final Predicate<String> predicate, final Consumer<Config> callback
489489
*/
490490
private Set<Object> bag = new LinkedHashSet<>();
491491

492-
/**
493-
* Keep track of modules.
494-
*/
495-
private final Set<Jooby.Module> modules = new LinkedHashSet<>();
496-
497492
/**
498493
* The override config. Optional.
499494
*/
@@ -511,6 +506,12 @@ public EnvDep(final Predicate<String> predicate, final Consumer<Config> callback
511506
/** Route's prefix. */
512507
private String prefix;
513508

509+
/** startup callback .*/
510+
private List<Runnable> onStart = new ArrayList<>();
511+
512+
/** stop callback .*/
513+
private List<Runnable> onStop = new ArrayList<>();
514+
514515
public Jooby() {
515516
this(null);
516517
}
@@ -626,6 +627,30 @@ public Jooby env(final Env.Builder env) {
626627
return this;
627628
}
628629

630+
/**
631+
* Run code at application startup time.
632+
*
633+
* @param callback A callback to run.
634+
* @return This instance.
635+
*/
636+
public Jooby onStart(final Runnable callback) {
637+
requireNonNull(callback, "Callback is required.");
638+
onStart.add(callback);
639+
return this;
640+
}
641+
642+
/**
643+
* Run code at application shutdown time.
644+
*
645+
* @param callback A callback to run.
646+
* @return This instance.
647+
*/
648+
public Jooby onStop(final Runnable callback) {
649+
requireNonNull(callback, "Callback is required.");
650+
onStop.add(callback);
651+
return this;
652+
}
653+
629654
/**
630655
* Run the given callback if and only if, app runs in the given enviroment.
631656
*
@@ -3016,7 +3041,6 @@ private Route.Definition appendDefinition(final Route.Definition route) {
30163041
*/
30173042
public Jooby use(final Jooby.Module module) {
30183043
requireNonNull(module, "A module is required.");
3019-
modules.add(module);
30203044
bag.add(module);
30213045
return this;
30223046
}
@@ -3201,6 +3225,8 @@ public void start(final String[] args, final Consumer<List<Route.Definition>> ro
32013225
end - start,
32023226
injector.getInstance(AppPrinter.class));
32033227

3228+
onStart.forEach(Runnable::run);
3229+
32043230
boolean join = config.hasPath("server.join") ? config.getBoolean("server.join") : true;
32053231
if (join) {
32063232
server.join();
@@ -3551,7 +3577,7 @@ private static List<Config> modconf(final Collection<Object> bag) {
35513577
*/
35523578
public void stop() {
35533579
if (injector != null) {
3554-
stopManaged();
3580+
stopManaged(injector, onStop);
35553581

35563582
try {
35573583
Server server = injector.getInstance(Server.class);
@@ -3565,10 +3591,10 @@ public void stop() {
35653591
}
35663592
}
35673593

3568-
private void stopManaged() {
3594+
private static void stopManaged(final Injector injector, final List<Runnable> onStop) {
35693595
// stop modules
35703596
injector.getInstance(LifecycleProcessor.class).destroy();
3571-
modules.clear();
3597+
onStop.forEach(Runnable::run);
35723598
}
35733599

35743600
/**

jooby/src/test/java/org/jooby/JoobyTest.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,47 @@ public void defaults() throws Exception {
649649
} , boot);
650650
}
651651

652+
@Test
653+
public void onStartStopCallback() throws Exception {
654+
655+
new MockUnit(Binder.class, Runnable.class)
656+
.expect(guice)
657+
.expect(shutdown)
658+
.expect(config)
659+
.expect(env)
660+
.expect(classInfo)
661+
.expect(ssl)
662+
.expect(charset)
663+
.expect(locale)
664+
.expect(zoneId)
665+
.expect(timeZone)
666+
.expect(dateTimeFormatter)
667+
.expect(numberFormat)
668+
.expect(decimalFormat)
669+
.expect(renderers)
670+
.expect(session)
671+
.expect(routes)
672+
.expect(routeHandler)
673+
.expect(params)
674+
.expect(requestScope)
675+
.expect(webSockets)
676+
.expect(tmpdir)
677+
.expect(err)
678+
.expect(unit -> {
679+
unit.get(Runnable.class).run();
680+
unit.get(Runnable.class).run();
681+
})
682+
.run(unit -> {
683+
684+
Jooby app = new Jooby()
685+
.onStart(unit.get(Runnable.class))
686+
.onStop(unit.get(Runnable.class));
687+
app.start();
688+
app.stop();
689+
690+
} , boot);
691+
}
692+
652693
@Test
653694
public void defaultsWithCallback() throws Exception {
654695

@@ -698,7 +739,8 @@ public void customEnv() throws Exception {
698739
expect(env.name()).andReturn("dev").times(2);
699740

700741
Env.Builder builder = unit.get(Env.Builder.class);
701-
expect(builder.build(isA(Config.class), isA(Jooby.class), isA(Locale.class))).andReturn(env);
742+
expect(builder.build(isA(Config.class), isA(Jooby.class), isA(Locale.class)))
743+
.andReturn(env);
702744

703745
Binder binder = unit.get(Binder.class);
704746

@@ -2017,7 +2059,6 @@ public void assets() throws Exception {
20172059
assertNotNull(route);
20182060
assertTrue(route.isPresent());
20192061

2020-
20212062
((RouteImpl) route.get()).handle(unit.get(Request.class), unit.get(Response.class),
20222063
unit.get(Route.Chain.class));
20232064

0 commit comments

Comments
 (0)