0 Replies Latest reply on Aug 22, 2011 3:09 PM by Oliver Treichel

    How can I run initialization code in the background on server startup

    Oliver Treichel Newbie

      Hi,

       

      I'd like to run some initialization code when AS 7.0.1 starts up. However, I don't want to block the startup of the server. Therefore, I'm trying to run the code in the background.

       

      So far, none of the options worked for me:

       

      1) I wrote a signleton session bean with @Startup @Sigleton and a @PostConstruct method that calls an @Asynchronous method:

      @Startup
      @Singleton
      public class StartupSingleton {
          @Inject
          private Logger logger;
      
      
          @Asynchronous
          private void asyncInit() {
              logger.info("begin initialization");
      
      
              try {
                  Thread.sleep(3000L);
              } catch (final InterruptedException e) {
              }
      
      
              logger.info("done initialization");
          }
      
      
          @PostConstruct
          public void Start() {
              logger.info("call asyncInit()");
              asyncInit();
              logger.info("continue startup");
          }
      }
      

       

      Expected result is:

      call asyncInit()
      begin initialization
      continue startup
      ...
      done initialization
      

       

      ... but instead I get:

      call asyncInit()
      begin initialization
      ...
      done initialization
      continue startup
      

       

      2) I moved the @Asynchronous method to a separate @Stateless session ejb and @Injected it onto the @Singleton

      @Startup
      @Singleton
      public class StartupSingleton {
          @Inject
          private Logger logger;
      
      
          @Inject
          private InitBean bean;
      
      
          @PostConstruct
          public void Start() {
              logger.info("call asyncInit()");
              bean.asyncInit();
              logger.info("continue startup");
          }
      }
      

       

      @Stateless
      public class InitBean {
          @Inject
          private Logger logger;
      
      
          @Asynchronous
          public void asyncInit() {
              logger.info("begin initialization");
      
      
              try {
                  Thread.sleep(3000L);
              } catch (final InterruptedException e) {
              }
      
      
              logger.info("done initialization");
          }
      }
      

       

      3) Fired a ContainerStartupEvent and @Observe it in a separate class:

      @Startup
      @Singleton
      public class StartupSingleton {
          @Inject
          private Logger logger;
      
      
          @Inject
          private Event<ContainerStartupEvent> event;
      
      
          @PostConstruct
          public void Start() {
              logger.info("fire event");
              event.fire(new ContainerStartupEvent());
              logger.info("continue startup");
          }
      }
      

       

      public class StartUpObserver {
          @Inject
          private Logger logger;
      
      
          public void startup(@Observes final ContainerStartupEvent event) {
              logger.info("begin initialization");
      
      
              try {
                  Thread.sleep(3000L);
              } catch (final InterruptedException e) {
              }
      
      
              logger.info("done initialization");
          }
      }
      

       

      4) Manually creating a new thread insde the initialization code doesn't work either, because then injected beans are not accessible on the new thread.

       

      Is there another solution to run code on server startup asynchronously?