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

如何在作业执行期间将数据保存到JobDataMap并在执行后访问它?

席兴朝
2023-03-14

我目前正在围绕Quartz.net开发某种简化的包装器,以便能够管理所有在后台注册和运行的作业,显示关于作业执行进度、百分比、返回关于当前作业状态的某种消息等的附加信息。例如,如果我目前的工作是将数据发布到社交媒体,我想看看当前发布到哪个社交媒体的数据,或者如果工作是发送电子邮件,我想实时查看当前生成了多少电子邮件,已经生成了多少电子邮件发了,还剩多少,等等。为此,我将数据保存到IJobExecttionContext(上下文。JobDetail.JobDataMap)中的作业执行方法。然后使用我的管理器获取所有当前正在执行的作业:

public List<IJobExecutionContext> RunningJobs
{
     get { return Scheduler.GetCurrentlyExecutingJobs().ToList(); }
}

并显示从每个IJobExecttionContextJobDataMap中获取的详细信息。这有点工作正常。但问题是,例如,如果作业执行失败,我想在JobDataMap中记录(保存)尽可能多的数据,包括html" target="_blank">异常对象本身。但是,问题是,在作业执行完成时上下文对象被处置。我失去了所有的数据。因此,当我试图获取当前计划的作业的所有JobDetail:

public List<IJobDetail> AllJobs
{
     get
     {
         var result = new List<IJobDetail>();
         var jobGroups = Scheduler.GetJobGroupNames();

         foreach(string group in jobGroups)
         {
            var groupMatcher = GroupMatcher<JobKey>.GroupContains(group);
            var jobKeys = Scheduler.GetJobKeys(groupMatcher);

            foreach(var jobKey in jobKeys)
            {
                var detail = Scheduler.GetJobDetail(jobKey);
                result.Add(detail);
            }
         }

         return result;
     }
}

我看不到我在作业执行期间保存到细节的数据。JobDataMap.但是我仍然可以看到工作初始化/计划时保存的数据,在实际执行之前。作为一个选项,我可以在执行期间捕获异常并记录它(我实际上正在这样做),但我想将此工作标记为失败,并在我的作业详细视图中显示失败的原因。它使用列表从我的经理(就像我工作的某种存储库)获取数据

所以,我必须使用某种额外的作业详细信息存储来保存执行期间的数据,然后获取所有计划的作业,并通过作业标识或其他方式映射这些数据。这不是我更喜欢的解决方案。或者它实际上有一种方法来保存数据到JobDataMap上执行和访问这些数据后执行?

共有1个答案

许俊贤
2023-03-14

经过一些研究,我发现Quartz中有两种类型的作业:有状态作业和无状态作业(无状态作业)。

有状态作业实例遵循的规则与常规作业实例略有不同。关键区别在于,在每次执行作业后,它们关联的JobDataMap都会重新持久化,从而为下一次执行保留状态。另一个区别是不允许有状态作业并发执行,这意味着在execute(xx)方法完成之前发生的新触发器将被延迟。

因此,为了实现我的目标,我只需要使用PersistJobDataAfterExecutionDisallowConcurrentExecution属性来装饰我的作业类,这些属性将使我的作业有状态,并在执行后将其持久化为JobDataMap。

 类似资料:
  • 问题内容: 我正在使用自定义的CreateView(CourseCreate)和UpdateView(CourseUpdate)保存和更新课程。保存课程后,我想采取措施。我将在新课程的讲师和用户之间建立新的多对多关系(如果尚不存在)。 因此,我想将“课程”另存为课程,然后使用“ course.faculty”创建该新关系。做到这一点的最佳地点在哪里? 我正在尝试在视图的form_valid中执行此

  • 我想在Spring Boot测试期间记录有关我的应用程序的启动信息。我已配置启动执行器并在Spring Boot“bootrun”模式下工作。但是,当我在使用TestRestTemplate进行测试期间尝试访问该执行器时,我收到404错误。 我已经编写了一个示例程序来演示这个问题。问题不在于针灸师,因为我的指标和健康执行器在同一个测试中工作。只有启动执行器。 示例代码在GitHub上

  • 我在Openshift环境中运行SCDF。我正在安排一个Spring批处理作业每5分钟运行一次。有时作业可能运行超过5分钟。在这种情况下,是否可以保留下一个计划的作业执行,直到上一个完成其执行? 我们不想改变作业执行的频率和间隔。 谢了。

  • 注意:我在纱线上使用火花 我一直在尝试Spark中实现的公制。我启用了ConsoleSink和CsvSink,并为所有四个实例(驱动程序、主程序、执行器和工作程序)启用了JvmSource。然而,我只有驱动程序输出,在控制台和csv目标目录中没有工人/执行者/主数据。 看完这个问题后,我想知道在提交作业时,是否需要向执行者发送一些东西。 我的提交命令:<code>/bin/sark提交——类org

  • 我正在使用实现AWS SQS作业队列。正确处理作业(拉作业- PHP工匠队列:工作 但在Lambda环境中,使用相同的凭证,作业完成后不能删除。简而言之,拉作业- “errorType”:“Aws\Sqs\Exception\SQSExException”, “errorMessage”:“在上执行”DeleteMessage“时出错”https://sqs.ap-northeast-1.amaz

  • 我正在亚马逊的EMR集群上同时运行3个Spark流进程。问题是这三个Spark流作业中的一个基于进行处理: 有没有办法在不更改代码的情况下解决这个问题?