当前位置: 首页 > 知识库问答 >
问题:

从动态创建的持久Quartz作业访问Spring对象

袁法
2023-03-14

石英2.2

我在运行时动态创建和调度Quartz作业,并将Quartz配置为JDBC-Job-Store。这些作业需要在应用程序执行之间保持不变。在作业执行期间,我需要访问完整的Spring上下文(Spring管理的bean和JPA事务)。

然而,如果我试图将任何东西自动加入到我的工作中,那么我会得到一个错误,比如…“通过字段MyAutowiredField表示的不满足的依赖项”

我想不通。我已经找到了无数的例子,展示如何让自动驾驶工作在石英工作,但几乎所有这些都只是静态的,硬编码的工作。而不是在运行时动态创建的作业。

下面的URL中的示例是最接近的。它动态地创造了就业机会,自动驾驶在其中发挥了很大的作用。然而,它是一个ram作业存储。当我切换到jdbc时,我又回到了原点。

https://icecarev.com/2016/11/05/spring-boot-1-4-and-quartz-scheduling-runtime-created-job-instances-from-a-configuration-file/

但是,他们的解决方案似乎都缺失了一些东西。例如,它们依赖于静态作业、触发器,或者只是简单的不工作等等。

有人有最新资源的提示或链接吗?

谢谢!

编辑%1

public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
{

    private transient AutowireCapableBeanFactory beanFactory;



    public AutowiringSpringBeanJobFactory(ApplicationContext context)
    {
        super();
        this.beanFactory = context.getAutowireCapableBeanFactory();

        MyJobClass job = new MyJobClass();
        beanFactory.autowireBean(new MyJobClass()); /** no problem **/
        beanFactory.initializeBean(job, "job");

    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception 
    {
        final Object job = super.createJobInstance(bundle); /* job is an instance MyJobClass.. same as above */
        beanFactory.autowireBean(job); /** "Unsatisfied dependency" exception **/
        beanFactory.initializeBean(job, "job");
        return job;
    }
}
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
    return bundle.getJobDetail().getJobClass().newInstance();
}
Object job = bundle.getJobDetail().getJobClass().newInstance();
MyJobClass myJob = (MyJobClass) job;
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception 
{
    String className = bundle.getJobDetail().getJobClass().getName();
    Object job = Class.forName(className).newInstance();
    beanFactory.autowireBean(job);
    job = beanFactory.applyBeanPostProcessorsAfterInitialization(job, "job");  // Without this, @Transactional in my job bean doesn't work
    beanFactory.initializeBean(job, "job");
    return job;
}

共有1个答案

严兴言
2023-03-14

当您提到“不是在运行时动态创建的作业.”时,我将假设您在某个时刻执行类似于以下操作:MyJob job=new MyJob()

如果您希望使用Spring@autowire在MyJob中注入依赖项,我想到的一种方法是:

  • @configurable(dependencyCheck=true)
  • 注释MyJob类
  • 使用Java代理运行Java进程:java-javaagent: ...
 类似资料:
  • 我想使用Quartz、Spring和Hibernate创建动态作业。用户与web服务交互以创建此类作业: NoaJobInstancesDAO是一个简单的DAO类,它利用了Hibernate的EntityManager: 问题是,当这个作业触发时,会抛出一个异常: 我不明白为什么!在Manager类中,我以这种方式安排作业 其中排定程序作为 Edit1:应用程序上下文的实例似乎正确。问题不可能在那

  • 在我的java应用程序中,我有一个Quartz作业,它每天运行一次,处理特定的任务。在我的方法中只有以下内容: 是一个实例变量。

  • 在这些工作中,我想从另一个应用程序访问spring-security安全bean方法。 这是我的应用程序结构。 -core -webapp -jobs-app 但是,所有的工作我都得这么做。 有没有一种方法可以让所有的作业作为一个特定的用户运行?可能是什么配置?

  • 我在grails中使用服务,并从控制器中的服务获取和设置数据,没有问题。我知道如何使用它。。。但是这个问题我解决不了,如果你知道出了什么问题,请帮助我。 有一个QuartzWork,我从控制器的服务时间表...数据存储在PostgreSQL中。使用所有插件和2.3.3 Grails的最新版本。在下面的代码中,我只想打印昵称,但我无法获得服务。试图得到豆,def grailsApplication但

  • 问题内容: 我对Java Quartz不太熟悉,我们只是使用了每天安排的测试工作。对于我们的Struts2 Web应用程序,我们希望运行一些计划在一天中不同时间的日常工作。作业应处于持久状态,以便即使由于服务器关闭/应用程序失败而导致作业失败,也应在服务器启动后稍后重新执行。我还可以将作业的状态/结果存储在DB中,以便监视作业。任何的意见都将会有帮助。 - 谢谢 问题答案: 无论您提到什么,都可以