[jboss-user] [Beginners Corner] - Re: Referencing EJBs from Scheduler w/JBOSS 4.2.2GA

mjhammel do-not-reply at jboss.com
Mon Jan 14 15:54:40 EST 2008


I still don't have injection working, but I've managed to get my Schedulable working using the same (slightly modified) technique that the Web Services class is using.  In the Web Services class I retrieved a UserTransaction by doing a lookup of java:/comp/UserTransaction.  This worked in the Web Services class but not in the the Schedulable.  After much googling, I found that doing the lookup as simply UserTransaction (no java:/comp prefix) works in both places.  So my Schedulable now looks like this:

package com.cei.crunch.schedulers;
  | 
  | import java.util.Date;
  | import org.jboss.varia.scheduler.Schedulable;
  | import org.apache.log4j.Logger;
  | 
  | import javax.ejb.*;
  | 
  | /* Crunch classes. */
  | import com.cei.crunch.ejb.*;
  | 
  | /**
  |  * A simple Schedulable example.
  |  * @author Michael J. Hammel
  |  * @version $Revision: 1.3 $
  |  */
  | @Stateless
  | public class CronSchedulable implements Schedulable
  | {
  |     private static final Logger log = Logger.getLogger(CronSchedulable.class);
  | 
  |     private String name;
  |     private long value;
  | 
  |     public CronSchedulable(String name, long value)
  |     {
  |         this.name = name;
  |         this.value = value;
  |         log.info("ctor, name: " + name + ", value: " + value);
  |     }
  | 
  |     public void perform(Date now, long remainingRepetitions)
  |     {
  |         SubscriberBean sb = null;
  |         Subscriber s = null;
  | 
  |         log.info("perform, now: " + now +
  |                  ", remainingRepetitions: " + remainingRepetitions +
  |                  ", name: " + name + ", value: " + value);
  | 
  |         sb = new SubscriberBean();
  |         if ( sb == null )
  |             log.info("Failed to get SubscriberBean.");
  |         else
  |         {
  |             s = sb.findSubscriber("CRUNCH-DEFAULT-SUPERUSER");
  |             if ( s != null )
  |             {
  |                 log.info("Subscriber info: \n" +
  |                     "Username  : " + s.getUsername() + "\n" +
  |                     "First name: " + s.getFirstname() + "\n" +
  |                     "Last name : " + s.getLastname() + "\n" +
  |                     "Email     : " + s.getEmailAddress()
  |                 );
  |             }
  |             else
  |                 log.info("Injection still not working - *sigh*.");
  |         }
  |     }
  | 
  | }

This, in turn, calls an EJB that looks like this:

package com.cei.crunch.ejb;
  | 
  | import javax.ejb.*;
  |     
  | import com.cei.crunch.ejb.Subscriber;
  | import com.cei.crunch.ejb.EJBUtil;
  | import com.cei.crunch.ejb.EJBUtil.EJBInit;
  |     
  |      
  | @Stateless
  | public class SubscriberBean implements SubscriberRemote {
  |      
  |     /* Default Constructor */
  |     public SubscriberBean() {}
  |             
  |     public Subscriber findSubscriber(String guid)
  |     {       
  |         Subscriber s = null;
  |         EJBInit ei = null;
  |         try {
  |             EJBUtil eu = new EJBUtil();
  |             ei = eu.ejbSetup();
  |         }   
  |         catch (EJBException ee) {
  |             System.out.println("findSubscriber(): " + ee.getMessage());
  |             ee.printStackTrace();
  |             return null;
  |         }   
  |          
  |         if ( ei.em == null )
  |         {
  |             System.out.println("SubscriberBean: em is null; can't find subscriber.");
  |         }
  |         else
  |         {
  |             try {
  |                 ei.utx.begin();
  |                 s = ei.em.find(Subscriber.class, guid);
  |                 ei.utx.commit();
  |             }
  |             catch (Exception e) {
  |                 System.out.println("SubscriberBean: exception in transaction: " + e.getMessage());
  |                 e.printStackTrace();
  |             }
  |         }
  |         return s;
  |     }
  | }

whose interface looks like this:

package com.cei.crunch.ejb;
  | 
  | import javax.ejb.Remote;
  | import com.cei.crunch.ejb.Subscriber;
  | 
  | @Remote
  | public interface SubscriberRemote {
  |     public Subscriber findSubscriber(String guid);
  | }  

The EJB also calls an initialization class (that lives in the same package as the EJB) that gets the InitialContext, EntityManager and UserTransaction.  This is where the switch from java:/comp/UserTransaction to UserTransction occurs, in the ctx.lookup() call.

package com.cei.crunch.ejb;
  | 
  | import javax.ejb.*;
  | import javax.persistence.*;
  | import javax.naming.InitialContext;
  | import javax.transaction.UserTransaction;
  | 
  | /** 
  |  * .Crunch server side utilities
  |  */
  | public class EJBUtil {
  | 
  |     public class EJBInit {
  |         public InitialContext ctx;
  |         public EntityManager em;
  |         public UserTransaction utx;
  |     }
  | 
  |     /**
  |      * Default constructor.
  |      */
  |     public EJBUtil() {}
  | 
  |     /**
  |      * Initialization for Web Services.
  |      */
  |     public EJBInit ejbSetup() throws EJBException
  |     {
  |         InitialContext ctx = null;
  |         EntityManager em = null;
  |         UserTransaction utx;
  |         try {
  |             ctx = new InitialContext();
  |             em =  (EntityManager) ctx.lookup("java:/CrunchPersistence");
  |             utx = (UserTransaction) ctx.lookup("UserTransaction");
  |         }
  |         catch (Exception e)
  |         {
  |             EJBException ee = new EJBException(e);
  |             ee.setMessage("Context setup failed.");
  |             throw ee;
  |         }
  |         if ( em == null )
  |         {
  |             EJBException ee = new EJBException("Failed to initialize entity manager.");
  |             throw ee;
  |         }
  |         else
  |         {
  |             EJBInit ei = new EJBInit();
  |             ei.ctx = ctx;
  |             ei.em = em;
  |             ei.utx = utx;
  |             return (ei);
  |         }
  |     }
  | 
  | }

The EJBException class is a simple exception class I wrote and is included in the same com.cei.crunch.ejb package.

While it doesn't use injection, it does appear to grab the correct row from the database, and that's about all I can ask for at the moment.  Actually making changes to the database hasn't been tested.  Hopefully, this helps someone else getting started with Schedulables and also can't get injection to work.

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4119812#4119812

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4119812



More information about the jboss-user mailing list