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:
// 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:
// 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.