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

    EJB3 Timer in seam

    John Smith Newbie


      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)


      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;
      public class SoundflavourHeartBeat implements SoundflavourHeartBeatService {
           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;
           private TimerService timerService;
           @In(create = true)
           private GetTrackSearchService getTrackSearchService;
           @In(required = false, scope = ScopeType.APPLICATION)
           @Out(required = false, scope = ScopeType.APPLICATION)
           private SoundflavourHeartBeatSearch soundflavourHeartBeatSearch;
           public void timeoutHandler(Timer timer) {
                try {
                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");
                if(hasHeartBeat()) {
                     log.debug("* Heart beat detected");     
                } else {
                     log.debug("* No heart beat, switching to emergency database");               
                }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");