使用调度表达式参数化 EJB 调度程序
Parameterize EJB scheduler with Schedule Expression
我正在使用 EJB 3.1 和 jboss-eap-6.4,我想为 ejb 调度程序的小时、分钟和秒设置一些动态参数,如下所示:
非参数代码 - 运行 每 5 分钟的第 30 秒:
@Singleton
@Startup
public class TriggerJob {
@EJB
//some db injections
@PostConstruct
public void onStartup() {
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
@Schedule(second = "30", minute = "*/5", hour = "*", persistent = false)
public void preparation() {
//my scheduled tasks
}
}
以上代码正确执行。
动态参数代码 - 每 5 分钟的第 30 秒应该 运行:
@Singleton
@Startup
public class TriggerJob {
@EJB
//some injections
private boolean runningFlag = false;
@Resource
private TimerService timerService;
public void setTimerService(TimerService timerService) {
this.timerService = timerService;
}
@Timeout
public void timerTimeout() {
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
@PostConstruct
private void postCunstruct() {
timerService.createCalendarTimer(createSchedule(),new TimerConfig("EJB timer service timeout at ",false));
}
private ScheduleExpression createSchedule() {
ScheduleExpression expression = new ScheduleExpression();
expression.hour("*")
.minute("*/5")
.second("30");
return expression;
}
public void preparation(){
// my scheduled tasks
}
}
以上代码执行不正确,一般是一秒执行多次
此外,我还阅读了一些对我没有帮助的其他问题:
Dynamic parameters for @Schedule method in an EJB 3.x
Using the Timer Service - The Java EE 6 Tutorial
如有任何帮助,我们将不胜感激。
相反,使用程序化调度,这是一个例子:
@Singleton
@Startup
public class TriggerJob{
@EJB
//some injections
@Resource
private TimerService timerService;
@PostConstruct
public void init() {
createTimer();
//the following code resolve my startup problem
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
@Timeout
public void timerTimeout() {
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
private void createTimer() {
ScheduleExpression scheduleExpression = new ScheduleExpression();
scheduleExpression.second("30").minute("*/5").hour("*");
TimerConfig timerConfig = new TimerConfig();
timerConfig.setPersistent(false);
timerService.createCalendarTimer(scheduleExpression, timerConfig);
}
public void preparation(){
// my scheduled tasks
}
}
我正在使用 EJB 3.1 和 jboss-eap-6.4,我想为 ejb 调度程序的小时、分钟和秒设置一些动态参数,如下所示:
非参数代码 - 运行 每 5 分钟的第 30 秒:
@Singleton
@Startup
public class TriggerJob {
@EJB
//some db injections
@PostConstruct
public void onStartup() {
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
@Schedule(second = "30", minute = "*/5", hour = "*", persistent = false)
public void preparation() {
//my scheduled tasks
}
}
以上代码正确执行。
动态参数代码 - 每 5 分钟的第 30 秒应该 运行:
@Singleton
@Startup
public class TriggerJob {
@EJB
//some injections
private boolean runningFlag = false;
@Resource
private TimerService timerService;
public void setTimerService(TimerService timerService) {
this.timerService = timerService;
}
@Timeout
public void timerTimeout() {
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
@PostConstruct
private void postCunstruct() {
timerService.createCalendarTimer(createSchedule(),new TimerConfig("EJB timer service timeout at ",false));
}
private ScheduleExpression createSchedule() {
ScheduleExpression expression = new ScheduleExpression();
expression.hour("*")
.minute("*/5")
.second("30");
return expression;
}
public void preparation(){
// my scheduled tasks
}
}
以上代码执行不正确,一般是一秒执行多次
此外,我还阅读了一些对我没有帮助的其他问题:
Dynamic parameters for @Schedule method in an EJB 3.x
Using the Timer Service - The Java EE 6 Tutorial
如有任何帮助,我们将不胜感激。
相反,使用程序化调度,这是一个例子:
@Singleton
@Startup
public class TriggerJob{
@EJB
//some injections
@Resource
private TimerService timerService;
@PostConstruct
public void init() {
createTimer();
//the following code resolve my startup problem
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
@Timeout
public void timerTimeout() {
try {
preparation();
} catch (CertificateVerificationException e) {
e.printStackTrace();
}
}
private void createTimer() {
ScheduleExpression scheduleExpression = new ScheduleExpression();
scheduleExpression.second("30").minute("*/5").hour("*");
TimerConfig timerConfig = new TimerConfig();
timerConfig.setPersistent(false);
timerService.createCalendarTimer(scheduleExpression, timerConfig);
}
public void preparation(){
// my scheduled tasks
}
}