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#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...