如何在Quartz中获取长期工作的作业实例?

时间:2012-11-29 06:24:13

标签: quartz-scheduler

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

我只想获取作业实例而不是JobDetail,并希望调用我已定义或想要访问成员变量的任何成员方法。

请您告诉我们如何实现这一目标?

谢谢, 卡锡尔

1 个答案:

答案 0 :(得分: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>

您工厂的基本实施:

/**
 * This job factory tries to locate the spring bean corresponding to the JobClass.
 *
 * @author Mathieu POUSSE
 */
public class SpringServiceJobFactory extends SpringBeanJobFactory implements JobFactory {

    @Autowired
    private ApplicationContext context;

    /**
     * {@inheritDoc}
     */
    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) 
                                       throws Exception {
        // create or get the bean instance
        Object bean = this.context.getBean(bundle.getJobDetail().getJobClass());

        // do what you want with the bean
        // but remeber what you did, otherwise if you forget to forget
        // you will have memory leaks !!!

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

        return bean ;
    }

}

HIH