EJB Timer:具有不同ScheduleExpression的相同EJB

时间:2014-06-05 12:23:03

标签: java-ee timer ejb-3.1

目前我的应用程序正在使用多个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的表。现在,表可以有两个条目用于相同的计划。

1 个答案:

答案 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分钟一次到达所有的全部小时)并检查满足哪个特定条件并为其执行调度程序。