java - 如何在QuartzDesk中手动添加Job Data Map?

标签 java quartz-scheduler scheduler

在 QuartzDesk 中,您可以通过在quartz-context.xml 中定义作业监听器来自动加载作业详细信息。

<bean name="testJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean" scope="prototype">
    <property name="jobClass" value="com.winenergy.integration.spring.quartz.ProcessTestJob" />
    <property name="jobDataMap">
        <map>
            <entry key="testBean" value-ref="testBean" />
        </map>
    </property>
    <property name="durability" value="true" />
</bean>

但从 UI 中,您可以手动添加新的作业详细信息。不幸的是,在作业数据映射部分,您只能在值部分添加字符串。需要一个java对象。一旦执行就会出现转换错误。有正确的方法吗?或者只能使用您的 spring 配置文件添加。

最佳答案

首先,在 Quartz JobDataMap 中传递除原始 Java 数据类型之外的任何内容都不是一个好的 Quartz 实践。请参阅 Quartz Best Practices 中的“仅在 JobDataMap 中存储原始数据类型”部分。 .

无需深入探讨太多细节,当涉及 QuartzDesk 时,您应该坚持仅使用字符串。正如您已经发现的那样,这允许您在 GUI 中编辑作业数据映射参数。在您的 Quartz 作业中,您可以使用 Quartz JobDataMap API 提供的转换方法。自动将字符串转换为 boolean 值、整数、 double 等。查看所有这些 getXYZFromString(String key) 转换方法 - 它们存在于 Quartz API 中是有充分理由的。

至于在作业数据映射参数中传递对象引用(Spring bean 引用),这是一个非常糟糕的主意,因为:

  1. 升级应用代码时,您将面临所有类型的 Java 序列化/版本控制问题。请注意,Quartz JobDataMaps 由 Quartz 序列化(至少当您使用 JDBCJobStore 时)。

  2. 您无法在 QuartzDesk GUI 或我所知道的任何其他 GUI 中编辑 Java 对象引用。这将如何运作?您是否期望一个组合加载 JVM 中存在的所有 Activity Java 对象? IMO,这不太可行。

如果您需要将 Spring bean 注入(inject) Quartz 作业中,您可以使用描述 here 的某种 AutowiringSpringBeanJobFactory 作业工厂实现。 .

如果您需要一个更动态的解决方案,使您的 Quartz 作业能够根据传递的作业数据映射参数值动态选择和调用 Spring bean,那么也许您可以传递 Spring bean 名称(即字符串)而不是 Spring bean 引用您的工作数据 map 。然后,您可以配置 SchedulerFactoryBean 以将 Spring 应用程序上下文注入(inject) SchedulerContext,您可以在作业的执行方法 (JobExecutionContext.getScheduler().getContext()) 中访问该 SchedulerContext。然后,您的作业可以在注入(inject)的 Spring 应用程序上下文中查找相关的 Spring bean(其名称在作业数据映射中传递)。您可能想要使用某种抽象作业基类来封装 Spring bean 查找逻辑,以便您的作业可以调用如下内容:

<T> T getSpringBean( JobExecutionContext jobExecCtx, String beanName, Class<T> beanType )

很抱歉有点冗长,但我觉得这需要更广泛的解释。

关于java - 如何在QuartzDesk中手动添加Job Data Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48634694/

相关文章:

java - Criteria API 按嵌套聚合属性排序

asp.net-mvc - 如何首先在 EF 代码上使用 UnitOfWorkPattern 在 ASP.NET MVC 中实现 Quartz.NET 作业

Go调度器和CGO : Please explain this difference of behavior?

mpi - 如何在多个节点中运行 MPI-Job? (多节点 MPI 作业执行)

java - 防止自定义系统字体覆盖应用程序字体

java - Spring JPA 的 Multi-Tenancy

quartz-scheduler - Quartz 调度程序在应用程序池回收后不执行作业(.Net)

java - 是否可以通过配置文件激活或停用作业以避免意外启动?

c# - 无法在 Quartz.NET 中使用 AdoJobStore

java - 为什么 ls ~ 或 ls $HOME 在进程中不起作用?