51 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
|  | package services;
 | ||
|  | 
 | ||
|  | import java.time.Clock;
 | ||
|  | import java.time.Instant;
 | ||
|  | import java.util.concurrent.CompletableFuture;
 | ||
|  | import javax.inject.*;
 | ||
|  | import play.Logger;
 | ||
|  | import play.inject.ApplicationLifecycle;
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * This class demonstrates how to run code when the
 | ||
|  |  * application starts and stops. It starts a timer when the
 | ||
|  |  * application starts. When the application stops it prints out how
 | ||
|  |  * long the application was running for.
 | ||
|  |  *
 | ||
|  |  * This class is registered for Guice dependency injection in the
 | ||
|  |  * {@link Module} class. We want the class to start when the application
 | ||
|  |  * starts, so it is registered as an "eager singleton". See the code
 | ||
|  |  * in the {@link Module} class to see how this happens.
 | ||
|  |  *
 | ||
|  |  * This class needs to run code when the server stops. It uses the
 | ||
|  |  * application's {@link ApplicationLifecycle} to register a stop hook.
 | ||
|  |  */
 | ||
|  | @Singleton
 | ||
|  | public class ApplicationTimer {
 | ||
|  | 
 | ||
|  |     private final Clock clock;
 | ||
|  |     private final ApplicationLifecycle appLifecycle;
 | ||
|  |     private final Instant start;
 | ||
|  | 
 | ||
|  |     @Inject
 | ||
|  |     public ApplicationTimer(Clock clock, ApplicationLifecycle appLifecycle) {
 | ||
|  |         this.clock = clock;
 | ||
|  |         this.appLifecycle = appLifecycle;
 | ||
|  |         // This code is called when the application starts.
 | ||
|  |         start = clock.instant();
 | ||
|  |         Logger.info("ApplicationTimer demo: Starting application at " + start);
 | ||
|  | 
 | ||
|  |         // When the application starts, register a stop hook with the
 | ||
|  |         // ApplicationLifecycle object. The code inside the stop hook will
 | ||
|  |         // be run when the application stops.
 | ||
|  |         appLifecycle.addStopHook(() -> {
 | ||
|  |             Instant stop = clock.instant();
 | ||
|  |             Long runningTime = stop.getEpochSecond() - start.getEpochSecond();
 | ||
|  |             Logger.info("ApplicationTimer demo: Stopping application at " + clock.instant() + " after " + runningTime + "s.");
 | ||
|  |             return CompletableFuture.completedFuture(null);
 | ||
|  |         });
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | }
 |