【问题标题】:Quartz trigger in ERROR state after storing an EJB in JobDataMap在 JobDataMap 中存储 EJB 后 Quartz 触发器处于 ERROR 状态
【发布时间】: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


【解决方案1】:

终于发现是注入EJB的persist期间的序列化问题。解决方案是更改实现并使用 JNDI 查找在 Job 中获取 EJB。

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多