java - transacciones - ejb 3.0 tutorial español
¿Se puede configurar EJB 3.1 @ Programar fuera del código de la aplicación? (3)
- ejb-jar.xml
Para mí, la variante de ejb-jar.xml comenzó a funcionar solo en TomEE. Pase el parámetro javax.ejb.Timer en el método de tiempo de espera:
<session>
<ejb-name>AppTimerService</ejb-name>
<ejb-class>my.app.AppTimerService</ejb-class>
<session-type>Singleton</session-type>
<timer>
<schedule>
<second>*/10</second>
<minute>*</minute>
<hour>*</hour>
</schedule>
<timeout-method>
<method-name>timeout</method-name>
<method-params>
<method-param>javax.ejb.Timer</method-param>
</method-params>
</timeout-method>
</timer>
public class AppTimerService {
public void timeout(Timer timer) {
System.out.println("[in timeout method]");
}
}
Gracias https://blogs.oracle.com/arungupta/entry/totd_146_understanding_the_ejb post.
- Variante de archivo de propiedades
Puedes leer el archivo .properties y crear un temporizador programáticamente
ScheduleExpression schedule = new ScheduleExpression();
schedule.hour(hourProperty);//previously read property from .properties file
schedule.minute(minuteProperty);//previously read property from .properties file
Timer timer = timerService.createCalendarTimer(schedule);
Pero no puedo encontrar podemos usar expresiones cron en EJB.
¿Cómo puedo configurar un intervalo de horarios:
@Schedule(persistent=true, minute="*", second="*/5", hour="*")
fuera del código de aplicación?
- ¿Cómo puedo configurarlo en ejb-jar.xml?
- ¿Puedo configurarlo fuera de la aplicación (tipo de archivo de propiedades)?
De acuerdo con la especificación EJB 3.1, los temporizadores automáticos se pueden configurar mediante anotaciones o mediante el ejb-jar.xml
implementación ejb-jar.xml
.
18.2.2 Creación automática del temporizador
El servicio de temporizador admite la creación automática de un temporizador basado en metadatos en la clase de bean o el descriptor de implementación . Esto permite al desarrollador de beans programar un temporizador sin depender de una invocación de beans para invocar mediante programación uno de los métodos de creación del temporizador del servicio de temporizador. Los temporizadores creados automáticamente son creados por el contenedor como resultado de la implementación de la aplicación.
Y mi comprensión del esquema del descriptor de implementación XLM es que lo define utilizando un elemento <timer>
dentro de un elemento <session>
.
<xsd:element name="timer"
type="javaee:timerType"
minOccurs="0"
maxOccurs="unbounded"/>
Consulte la definición del tipo complejo timerType
para obtener información detallada (en particular, los elementos del timeout-method
schedule
y de timeout-method
).
Referencias
- Especificación EJB 3.1
- Sección 18.2.2 "Creación automática del temporizador"
- Sección 19.5 "Esquema XML del descriptor de implementación" (p. 580, p583-p584)
Este es un ejemplo de una programación en el descriptor de implementación:
<session>
<ejb-name>MessageService</ejb-name>
<local-bean/>
<ejb-class>ejb.MessageService</ejb-class>
<session-type>Stateless</session-type>
<timer>
<schedule>
<second>0/18</second>
<minute>*</minute>
<hour>*</hour>
</schedule>
<timeout-method>
<method-name>showMessage</method-name>
</timeout-method>
</timer>
</session>
Otra forma de configurar los temporizadores es con una programación programática.
@Singleton
@Startup
public class TimedBean{
@Resource
private TimerService service;
@PostConstruct
public void init(){
ScheduleExpression exp=new ScheduleExpression();
exp.hour("*")
.minute("*")
.second("*/10");
service.createCalendarTimer(exp);
}
@Timeout
public void timeOut(){
System.out.println(new Date());
System.out.println("time out");
}
}