When our Micronaut application starts we can listen for the ServiceStartedEvent
event and write code that needs to run when the event is fired. We can write a bean that implements the ApplicationEventListener
interface with the type ServiceStartedEvent
. Or we can use the @EventListener
annotation on our method with code we want to run on startup. If the execution of the code can take a while we can also add the @Async
annotation to the method, so Micronaut can execute the code on a separate thread.
In our example application we have a reactive repository for a Mongo database and we want to save some data in the database when our Micronaut application starts. First we write a bean that implements the ApplicationEventListener
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | // File: src/main/java/mrhaki/Dataloader.java package mrhaki; import io.micronaut.context.annotation.Requires; import io.micronaut.context.env.Environment; import io.micronaut.context.event.ApplicationEventListener; import io.micronaut.discovery.event.ServiceStartedEvent; import io.micronaut.scheduling.annotation.Async; import io.reactivex.Flowable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Singleton; @Singleton @Requires (notEnv = Environment.TEST) // Don't load data in tests. public class DataLoader implements ApplicationEventListener<ServiceStartedEvent> { private static final Logger log = LoggerFactory.getLogger(DataLoader. class ); /** * Reactive repository for Mongo database to store * Conference objects with an id and name property. */ private final ConferenceRepository repository; public DataLoader( final ConferenceRepository repository) { this .repository = repository; } @Async @Override public void onApplicationEvent( final ServiceStartedEvent event) { log.info( "Loading data at startup" ); // Transform names to Conferences object and save them. Flowable.just( "Gr8Conf" , "Greach" , "JavaLand" , "JFall" , "NextBuild" ) .map(name -> new Conference(name)) .forEach( this ::saveConference); } /** * Save conference in repository. * * @param conference Conference to be saved. */ private void saveConference(Conference conference) { repository .save(conference) .subscribe( saved -> log.info( "Saved conference {}." , saved), throwable -> log.error( "Error saving conference." , throwable)); } } |
Alternatively we could have used the @EventListener
annotation on a method with an argument of type ServiceStartedEvent
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | // File: src/main/java/mrhaki/Dataloader.java package mrhaki; import io.micronaut.context.annotation.Requires; import io.micronaut.context.env.Environment; import io.micronaut.context.event.ApplicationEventListener; import io.micronaut.discovery.event.ServiceStartedEvent; import io.micronaut.runtime.event.annotation.EventListener; import io.micronaut.scheduling.annotation.Async; import io.reactivex.Flowable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Singleton; @Singleton @Requires (notEnv = Environment.TEST) // Don't load data in tests. public class DataLoader { private static final Logger log = LoggerFactory.getLogger(DataLoader. class ); /** * Reactive repository for Mongo database to store * Conference objects with an id and name property. */ private final ConferenceRepository repository; public DataLoader( final ConferenceRepository repository) { this .repository = repository; } @EventListener @Async public void loadConferenceData( final ServiceStartedEvent event) { log.info( "Loading data at startup" ); // Transform names to Conferences object and save them. Flowable.just( "Gr8Conf" , "Greach" , "JavaLand" , "JFall" , "NextBuild" ) .map(name -> new Conference(name)) .forEach( this ::saveConference); } /** * Save conference in repository. * * @param conference Conference to be saved. */ private void saveConference(Conference conference) { repository .save(conference) .subscribe( saved -> log.info( "Saved conference {}." , saved), throwable -> log.error( "Error saving conference." , throwable)); } } |
When we start our Micronaut application we can see in the log messages that our conference data is created:
22:58:17.343 [pool-1-thread-1] INFO mrhaki.DataLoader - Loading data at startup 22:58:17.343 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 1230ms. Server Running: http://localhost:9000 22:58:17.573 [Thread-11] INFO mrhaki.DataLoader - Saved conference Conference{id=5bb134f505d4feefa74d19c7, name='JFall'}. 22:58:17.573 [Thread-8] INFO mrhaki.DataLoader - Saved conference Conference{id=5bb134f505d4feefa74d19c3, name='Gr8Conf'}. 22:58:17.573 [Thread-10] INFO mrhaki.DataLoader - Saved conference Conference{id=5bb134f505d4feefa74d19c5, name='Greach'}. 22:58:17.573 [Thread-9] INFO mrhaki.DataLoader - Saved conference Conference{id=5bb134f505d4feefa74d19c8, name='NextBuild'}. 22:58:17.573 [Thread-6] INFO mrhaki.DataLoader - Saved conference Conference{id=5bb134f505d4feefa74d19c6, name='JavaLand'}. |
Written with Micronaut 1.0.0.RC1.