目前我的应用程序正在使用多个EJB计时器。但是,客户有一个新的要求,每个时间表必须有" n"不同的ScheduleExpression。例如,它必须针对不同的时区运行,但运行相同的代码。我试图将相同的无状态EJB与另一个ScheduleExpression
关联,但只运行第一个表达式。我想这是因为它是@Stateless
EJB的相同实例。
我如何复制这些EJB? TKS
启动计划的代码:
Calendar cal = Calendar.getInstance();
String hour = ("*".equals(calendarSchedule.getHour()) ? "0"
: calendarSchedule.getHour());
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));
String minute = ("*".equals(calendarSchedule.getMinute()) ? "0"
: calendarSchedule.getMinute());
cal.set(Calendar.MINUTE, Integer.parseInt(minute));
String dayOfWeek = ("*".equals(calendarSchedule.getDayOfWeek()) ? "0"
: calendarSchedule.getDayOfWeek());
cal.set(Calendar.DAY_OF_WEEK, Integer.parseInt(dayOfWeek));
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm");
LOGGER.debug("schedule " + name + " for: "
+ sdf.format(cal.getTime()));
}
TimerConfig timerConfig = new TimerConfig();
timerConfig.setInfo(name);
timerConfig.setPersistent(false);
timerService
.createCalendarTimer(this.calendarSchedule, timerConfig);
setStarted(true);
LOGGER.info("Schedule " + this.name + " was started.");
应用程序在WebSphere 8.5上运行。时间表尚未修复。我使用@Singleton
和@Startup
EJB来读取带有ScheduleExpression的表。现在,表可以有两个条目用于相同的计划。
答案 0 :(得分:0)
首先,不要重复EJB - 你说的是运行相同的逻辑,只需要不同的时间表。
其次,对我来说并不明显 - 你是在固定时间运行还是每次计算不同?
如果修复:
使用注释进行计划。
在Java 7之前,您只能将一个@Schedule
表达式与Java 8中的每种类型相关联(如果可能的话),您可以重复相同的注释。
无论如何,您可以使用以下注释来指定多个计划:
@Schedules ({
@Schedule(dayOfMonth="Last"),
@Schedule(dayOfWeek="Fri", hour="23")
})
如果是个人: 您可能希望为最小的公共间隔设置一个固定的计划(假设您需要在10:00,10:30,14:00,16:30运行,那么它将是每30分钟一次到达所有的全部小时)并检查满足哪个特定条件并为其执行调度程序。