使用 spring 在 Quartz 调度程序中完成作业后插入数据

Posted

技术标签:

【中文标题】使用 spring 在 Quartz 调度程序中完成作业后插入数据【英文标题】:Insert data after completing job in Quartz scheduler using spring 【发布时间】:2015-11-24 10:18:36 【问题描述】:

我正在处理一项需要将​​工作状态保存在数据库中的任务,但是当我尝试这样做时,它给了我java.lang.nullpointerexception。我认为这是因为每当我尝试从数据库中选择/保存/更新任何记录时,它都会给我类似的错误。

这是我的代码

public class PostFBJob implements Job 

    private SchedulerService schedulerService;

    private SubCampaignService subCampaignService;

    @SuppressWarnings("unchecked")
    public void execute(JobExecutionContext context) throws JobExecutionException 

        JobDetail jobDetail = context.getJobDetail();
        JobDataMap jobDataMap = jobDetail.getJobDataMap();

        schedulerService = (SchedulerService) jobDataMap.get("schedulerService");

        SubCampaign subCampaign = (SubCampaign) jobDataMap.get("subCampaign");

        if (prStreamItem.getName().equalsIgnoreCase("Facebook") && StringUtils.isNotBlank(branch.getFbAccessToken())) 
            FacebookService facebookService = FacebookService.getSingleton();
            try 
                subCampaign.setStatus("Completed");
                subCampaign.setMessage("Completed");

                subCampaignService.updateSubCampaign(subCampaign);

             catch (Exception e) 
                log.error("", e);
            
        
    

例外

java.lang.NullPointerException
    at com.ace.Job.SubCampaignJob.execute(SubCampaignJob.java:147)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Error: java.lang.NullPointerException

请帮我解决这个问题。我是 Spring 和 Quartz 的新手。

提前致谢

【问题讨论】:

请同时提供有问题的整个例外情况。 NullPointerException 是最容易调试的问题之一:堆栈跟踪会告诉您它发生的文件和行号。调试器中的快速旋转将显示未正确初始化的引用。无法从您发布的代码中分辨出来。我在这里看不到数据库代码; updateSubCampaign 是我的最佳猜测。 是的,你是。使用调试器。 IntelliJ 是市场上最好的 IDE,并且有社区版本。去实现它(梦想);去得到它(东西。要成为一名成功的程序员,调试是一项关键技能。 不。当我写这篇文章时,你在 47 分钟前发布了这个问题。如果您有调试器并知道如何使用它,您就会发现并继续前进。即使在使用之前为每个参考添加 println 输出,也会比在 SO 上询问更快。 @KatjaChristiansen 这个问题与nullpointerexception 完全不同,因为石英控制器不允许我从其中访问服务层而发生错误 【参考方案1】:

由于 subCampaignService 的 null 对象导致此异常。 注入只对那些由 s​​pring 管理的对象起作用。

扫描您要使用服务的所有包。

    基于注解的配置

    @ComponentScan("com.ace")

    基于 XML 的配置

    <context:component-scan base-package="com.ace"/>

并且在更新前检查 null 如下:

try 
    subCampaign.setStatus("Completed");
    subCampaign.setMessage("Completed");
    if(subCampaign != null && subCampaignService != null) //Check is not null to subCampaign before update
    subCampaignService.updateSubCampaign(subCampaign);
 catch (Exception e) 
     log.error("", e);

【讨论】:

@Service 注释放入SubCampaignService 类然后检查。 按照答案中的定义检查 null。 只有当我尝试从石英调度程序输入数据时才会导致问题,否则它对我的其他模块有效 检查一下,它在以下行给了我错误subCampaignService.updateSubCampaign(subCampaign); public PostFBJob(SubCampaignService subCampaignService ) this.subCampaignService = subCampaignService 在这个类中添加这个然后检查【参考方案2】:

我想你要找的答案就在这里

请查看以下链接

Correct way to persist Quartz triggers in database

您也可以查看此链接

Using Hibernate session with quartz

【讨论】:

我不明白为什么有人会更喜欢 Quartz 而不是内置的 Executor。感觉像是一种不必要的依赖。 @duffymo 抱歉,我无法理解您在这里想说什么。我回答这个问题是因为我认为这就是他要找的东西 此评论并非针对您或批评您的回答。这更像是一种观察,而不是其他任何东西。我认为 Quartz 是不必要的,因为 JDK7 和并发包。

以上是关于使用 spring 在 Quartz 调度程序中完成作业后插入数据的主要内容,如果未能解决你的问题,请参考以下文章

quartz任务调度框架与spring整合

10 -- 深入使用Spring -- 5...1 使用Quartz

SpringBoot整合Quartz

Spring与Quartz的整合实现定时任务调度

Quartz学习(转)

Spring 中使用Quartz实现任务调度