【发布时间】:2019-04-10 09:34:25
【问题描述】:
我有一个启动单例 EJB,而不是初始化调度程序并将 EJB 存储在 JobDataMap 中。当我存储 EJB 时,触发器进入 ERROR 状态。
@Singleton
@Startup
@Lock(LockType.READ)
public class NotificationScheduler {
private Scheduler scheduler;
@Inject
private QuartzProperties quartzProperties;
@Inject
private NotificationMailProcess notificationMailProcess;
@PostConstruct
public void init() {
try {
Properties properties = new Properties();
properties.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, "NotificationScheduler");
properties.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_ID, StdSchedulerFactory.AUTO_GENERATE_INSTANCE_ID);
properties.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, quartzProperties.getQuartzThreadPoolClass());
properties.put(StdSchedulerFactory.PROP_THREAD_POOL_PREFIX + ".threadCount", quartzProperties.getQuartzThreadPoolCount());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, quartzProperties.getQuartzJobStoreClass());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_PREFIX + ".driverDelegateClass",
quartzProperties.getQuartzJobStoreDriverDelegateClass());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_PREFIX + ".dataSource", quartzProperties.getQuartzJobStoreDataSource());
properties.put("org.quartz.dataSource." + quartzProperties.getQuartzJobStoreDataSource() + ".jndiURL",
quartzProperties.getQuartzJobStoreDataSource());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_PREFIX + ".nonManagedTXDataSource",
quartzProperties.getQuartzJobStoreNonManagedTXDataSource());
properties.put("org.quartz.dataSource." + quartzProperties.getQuartzJobStoreNonManagedTXDataSource() + ".jndiURL",
quartzProperties.getQuartzJobStoreNonManagedTXDataSource());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_PREFIX + ".isClustered", quartzProperties.getQuartzJobStoreIsClustered());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_PREFIX + ".clusterCheckinInterval",
quartzProperties.getQuartzJobStoreClusterCheckinInterval());
StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
schedulerFactory.initialize(properties);
scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("process", notificationMailProcess);
JobDetail notificationMailJobDetail = newJob(NotificationMailJob.class) .withIdentity(Constants.JOB_NAME,Constants.JOB_GROUP).usingJobData(jobDataMap).build();
String cronExpression = Constants.CONFIGURATION_DEFAULT_JOB_CRON);
Trigger trigger = newTrigger().withIdentity(Constants.JOB_TRIGGER, Constants.JOB_GROUP)
.withSchedule(cronSchedule(cronExpression)).build();
scheduler.scheduleJob(notificationMailJobDetail, new HashSet<>(Arrays.asList(trigger)), true);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
NotificationMailProcess 是一个虚拟 EJB 类,它实现了带有 @Stateless 注释的 Serializable 接口。
【问题讨论】:
标签: java jakarta-ee quartz-scheduler