Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Iniciar clase en EJB

Buenas,
Estoy realizando una aplicación que ejecuta un proceso periódicamente con quartz, esta aplicación solo se compone de EJB, no posee modulo Web; necesito que una clase se ejecute automáticamente en el inicio, es decir, al desplegar el modulo en el servidor de aplicaciones. Si la aplicación tuviera modulo web no habría problema porque se pondría el llamado en el web.xml a un servlet y este ejecutaría la clase, pero dado que solo es un EJB no posee este archivo. Aclaro que no es posible utilizar un singleton con la anotacion startup, pues ya lo intente y como es un proceso que se ejecuta indefinidamente el proceso de implementación en el servidor nunca termina. Existe alguna otra manera de realizar esto? tal vez con algun xml del mismo modo que en el modulo web o de otra forma.

Gracias.

febrero 19, 2012 | Registered Commentercamilo-q

Puedes implementar el método "public void ejbCreate()" que se ejecutará cuando se cree el EJB.

febrero 19, 2012 | Registered CommenterUnai Valle

Intentaste hacerlo con una llamada a un método asíncrono?

febrero 19, 2012 | Registered Commenterantoniovl

Con EJB3, existe la annotation @PostConstruct, que será ejecutado cuando sea construido el EJB, justamente después, pues todas la inyecciones están creadas y todo los atributos iniciados.

@PostConstruct
public void metodoInicial(){
//Tú codigo
{

febrero 20, 2012 | Registered Commentermarsim86

Ya lo intente utilizando una clase singleton y la anotación startup para que arranque al implementar, al igual que un método anotado con postconstruct, el problema es que el método no termina de ejecutarse ya que como es un job de quartz se ejecuta indefinidamente y por lo tanto no termina de implementarse.

febrero 21, 2012 | Registered Commentercamilo-q

Ya lo intente utilizando una clase singleton y la anotación startup para que arranque al implementar, al igual que un método anotado con postconstruct, el problema es que el método no termina de ejecutarse ya que como es un job de quartz se ejecuta indefinidamente y por lo tanto no termina de implementarse.

Intenta esto: define otro método (en el EJB anotado con @Singleton y @Startup) que inicie la tarea que necesitas y lo anotas como asíncrono. Desde @PostConstruct invocas el método asíncrono, con la salvedad de que nunca consultarás el valor futuro. Probablemente tendrás que implementar la tarea de una forma que no sea un Job de Quartz (que igual JavaEE6 ya tiene timers bastante decentes).

febrero 21, 2012 | Registered Commenterantoniovl

Perfecto, gracias a todos, lo realice como me aconsejaba antoniovl y funciono.
Aqui les dejo el codigo en caso de que necesiten realizar algo similar:


@Singleton
@LocalBean
@Startup
public class ArrancaScheduler {
@EJB
private AlarmJobFactoryLocal factoryLocal;

@PostConstruct
public void initSingleton(){
factoryLocal.initScheduler();
}
}

-------------------------------------------------------------------------------------------------------

@Local
public interface AlarmJobFactoryLocal {
public void initScheduler();
}

-------------------------------------------------------------------------------------------------------

@Singleton
@LocalBean
public class AlarmJobFactory implements AlarmJobFactoryLocal{

@Asynchronous
@Override
public void initScheduler(){
try {
// start the Scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();

// create the Job
JobDetail job = JobBuilder.newJob(ActivityJob.class).
withIdentity("ActivityJob").build();

// create the Schedule, run every 5 seconds
ScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.
simpleSchedule().
withIntervalInSeconds(5).
repeatForever();

// create the Trigger
Trigger trigger = TriggerBuilder.
newTrigger().
withIdentity("QuickQuartzTrigger").
withSchedule(scheduleBuilder).
startNow().build();

// schedule the Job
scheduler.scheduleJob(job, trigger);

// run for 30 seconds and exit
Thread.sleep(1000 * 30);
scheduler.shutdown();
} catch (InterruptedException ex) {
Logger.getLogger(AlarmJobFactory.class.getName()).log(Level.SEVERE, null, ex);
} catch (SchedulerException ex) {
Logger.getLogger(AlarmJobFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

-------------------------------------------------------------------------------------------------------

public class ActivityJob implements Job {

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println( new Date() );
}

}

Gracias.

febrero 24, 2012 | Registered Commentercamilo-q