1

我通过扩展默认类添加了几个成员变量和成员方法来创建自己的作业类。我看到工作被触发并且运行了很长时间。

我只是想获得 Job Instance 而不是 JobDetail 并想调用我定义的任何成员方法或想要访问成员变量。

您能否让我知道我们如何实现这一目标?

谢谢, 凯瑟尔

4

1 回答 1

0

没有这样的方式,可能是因为石英是为了与远程调度模式(即集群)兼容。

但是,如果您在单个服务器/应用程序上下文中使用它,您可能会实现自己的 JobFactory ( http://quartz-scheduler.org/api/2.1.5/org/quartz/simpl/SimpleJobFactory.html )只需将实例的创建委托给超类,然后以某种方式在地图或其他东西中注册实例。然后,您必须遍历地图键才能找到您正在查看的实例。

小心使用这种解决方案的内存泄漏


快速示例:

在您的弹簧配置文件中:

<!-- quartz scheduler -->
<bean id="orchestration-api-quartz-factory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="configLocation" value="classpath:spring/quartz.properties"/>
    <property name="jobFactory">
        <bean class="service.scheduler.SpringServiceJobFactory"/>
    </property>
</bean>

以及您工厂的基本实现:

/**
 * 这个作业工厂试图定位到JobClass对应的spring bean。
 *
 * @author Mathieu POUSSE
 */
公共类 SpringServiceJobFactory 扩展 SpringBeanJobFactory 实现 JobFactory {

    @自动连线
    私有 ApplicationContext 上下文;

    /**
     * {@inheritDoc}
     */
    @覆盖
    受保护对象 createJobInstance(最终 TriggerFiredBundle 捆绑包)
                                       抛出异常 {
        // 创建或获取 bean 实例
        对象 bean = this.context.getBean(bundle.getJobDetail().getJobClass());

        // 用 bean 做你想做的事
        // 但记住你做了什么,否则如果你忘记了
        // 你会有内存泄漏!!!

        // myConcurrentMap.put("job.key", bean);

        回豆;
    }

}

HIH

于 2012-12-06T17:26:44.970 回答