1 Reply Latest reply on Apr 18, 2008 4:29 PM by Hans Schlegel

    EJB3 Timer in seam

    John Smith Newbie

      Hi,


      I have created a EJB3 Timer bean and registered it as a seam component, but all the other components that are suppose to be  injected are null, ie no injection. Am I do anything wrong or has anyone got a working example


      I initialise the timer by calling the start() methods, and then @Timeout annotates the method to be called, but this throws a null pointer when accessing any injected components
      (in this case searchEngine)


      thanks!



      package com.ricall.services.timer.soundflavour.impl;
      
      import java.util.Date;
      
      import javax.annotation.Resource;
      import javax.ejb.Stateless;
      import javax.ejb.Timeout;
      import javax.ejb.Timer;
      import javax.ejb.TimerService;
      
      import org.jboss.seam.ScopeType;
      import org.jboss.seam.annotations.In;
      import org.jboss.seam.annotations.Logger;
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Out;
      import org.jboss.seam.contexts.Contexts;
      import org.jboss.seam.log.Log;
      
      import com.ricall.domain.admin.SearchEngine;
      import com.ricall.services.search.webservice.GetTrackSearchService;
      import com.ricall.services.timer.soundflavour.SoundflavourHeartBeatService;
      import com.sirensystems.SelectionResultSet;
      
      @Stateless
      @Name("soundflavourHeartBeatService")
      public class SoundflavourHeartBeat implements SoundflavourHeartBeatService {
           @Logger
           private Log log;
      
           @In(required = false, scope=ScopeType.APPLICATION)
           @Out(required=false, scope=ScopeType.APPLICATION)
           private SearchEngine searchEngine;
           
           @In(required = false, scope=ScopeType.APPLICATION)
           @Out(required=false, scope=ScopeType.APPLICATION)
           private Boolean usingEmergencyDatabase;
      
           @Resource
           private TimerService timerService;
      
           @In(create = true)
           private GetTrackSearchService getTrackSearchService;
      
           @In(required = false, scope = ScopeType.APPLICATION)
           @Out(required = false, scope = ScopeType.APPLICATION)
           private SoundflavourHeartBeatSearch soundflavourHeartBeatSearch;
      
           @Timeout
           public void timeoutHandler(Timer timer) {
                try {
                log.debug("---------------------");
                log.debug("* Received Timer event: " + timer.getInfo() + searchEngine);
                searchEngine = (SearchEngine) Contexts.getApplicationContext().get("searchEngine");
                
                //If using database as default, don't check heartbeat
                if(usingEmergencyDatabase == false && searchEngine == SearchEngine.DATABASE) {
                     log.debug(" Using database as default, not checking heart beat");
                     return;
                }
                
                if(hasHeartBeat()) {
                     log.debug("* Heart beat detected");     
                     switchToSoundflavour();
                } else {
                     log.debug("* No heart beat, switching to emergency database");               
                     switchToEmergencyDatabase();
                }
                log.debug("---------------------");
                }catch (Exception e) {
                     log.error("", e);
                }
           }
      
      
      
           private boolean hasHeartBeat() {
                try {
                     SelectionResultSet selectionResultSet = getSongsFromCombinedSearch();
                     if (selectionResultSet == null)
                          throw new NullPointerException();
                     return true;
                } catch (Exception e) {
                     log.error("Soundflavour not responding", e);
                     return false;
                }
           }
      
           private void switchToEmergencyDatabase() {
                searchEngine = SearchEngine.DATABASE;
                usingEmergencyDatabase = true;
           }
           
           private void switchToSoundflavour() {
                usingEmergencyDatabase = false;
                searchEngine = SearchEngine.WEBSERVICE;
           }     
      
           public Timer start() {
                System.out.println("Starting timer!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                
                return timerService.createTimer(new Date(
                          System.currentTimeMillis() + 50000), 1000,
                          "soundflavour heartbeat");
           }
      }