在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中,您可以手动添加新的“作业详细信息”。遗憾的是,在“作业数据映射”部分中,您只能在值部分中添加String。需要一个java对象。执行后会出现转换错误。有没有正确的方法呢?或者只能使用spring配置文件添加。
答案 0 :(得分:1)
首先,在Quartz JobDataMap中传递除原始Java数据类型之外的其他东西并不是一个好的Quartz实践。请参阅&#34;仅存储JobDataMap中的原始数据类型&#34; Quartz Best Practices中的部分。
在没有深入细节的情况下,当谈到QuartzDesk时,你应该坚持只使用Strings。这允许您在已经发现的GUI中编辑作业数据映射参数。在Quartz作业中,您可以使用Quartz JobDataMap API提供的转换方法自动将字符串转换为布尔值,整数,双打等。查看所有那些getXYZFromString(String key)转换方法 - 它们存在于Quartz API中这是有充分理由的。
至于在作业数据图参数中传递对象引用(Spring bean引用),这是非常糟糕的主意,因为:
升级应用代码时,您将面临所有类型的Java序列化/版本控制问题。请注意,Quartz JobDataMaps由Quartz序列化(至少在您使用JDBCJobStore时)。
您无法在QuartzDesk GUI或我知道的任何其他GUI中编辑Java对象引用。这怎么样?您是否期望组件加载JVM中存在的所有活动Java对象?国际海事组织,这不太可行。
如果您需要将Spring bean注入Quartz作业,您可以使用某种描述here的AutowiringSpringBeanJobFactory作业工厂实现。
如果您需要一个更动态的解决方案,使您的Quartz作业能够根据传递的作业数据映射参数值动态选择和调用Spring bean,那么也许您可以传递Spring bean名称(即字符串)而不是Spring bean引用你的工作数据图。然后,您可以配置SchedulerFactoryBean以将Spring应用程序上下文注入到您可以在作业的execute方法中访问的SchedulerContext(JobExecutionContext.getScheduler()。getContext())。然后,您的作业可以在注入的Spring应用程序上下文中查找相关的Spring bean(其名称在作业数据映射中传递)。您可能希望使用某种抽象作业基类来封装Spring bean查找逻辑,以便您的作业可以调用类似的内容:
<T> T getSpringBean( JobExecutionContext jobExecCtx, String beanName, Class<T> beanType )
我很抱歉有点冗长,但我觉得这需要一个更广泛的解释。