下图描述了Jobs/Cronjobs在Hybris中如何工作的完整视图,我们将以此为起点解释Job和Cronjob之间的区别。
由于Car 需要Engine 才能工作,Cronjob 也需要Job。就像没有引擎的汽车不再是汽车一样,没有Job 的Cronjob 什么都不是。
Job 是这个等式中的有意识元素,它定义了Cronjob 要执行的逻辑。
同时Cronjob是Job和Users之间的中间,通过Cronjob用户可以发送信息(优先级、触发器、节点...)和命令(启动、停止、中止...)到Job 正常工作,Job 也可以通过Cronjob 向用户显示消息(数据、状态、结果、日志……)。
我相信最有效的学习方法是通过例子,所以让我们做一个:
世界上对Hybris 最多的要求之一是创建一个Cronjob,以导出选定catalogVersion 的所有products。
- 首先,让我们创建Cronjob,在
Cronjob 中定义输入,我们将发送到Job。
<itemtype code="ExporterCronJob" extends="Cronjob" autocreate="true" generate="true" >
<attributes>
<!-- The input is the catalogVersion -->
<attribute qualifier="catalogVersion" type="CatalogVersion" >
<persistence type="property" />
</attribute>
</attributes>
</itemtype>
- 接下来是让 Job 保存导出的逻辑,但是创建
Job 并不总是那么明显,因为你必须处理Jalos 而我讨厌Jalos :p
幸运的是,Hybris 拥有另一种创建Job 的方法,而无需使用Jalos,我们稍后会介绍。
创建Job的传统方法是问题中提出的一种方法,即创建一个从JobModel扩展的item,并在创建的item对应的Jalo中实现该方法performCronJob(CronJob cronJob) 并在此方法中创建所有逻辑。
我以前从未使用过这种方法,所以推荐的方法是使用ServicelayerJobModel,ServicelayerJobModel 已经扩展了JobModel 并为您实现了performCronJob(CronJob cronJob)。
ServicelayerJobModel 是如何工作的?它通过SpringID引用JobPerformable,然后执行JobPerformable中定义的逻辑。
因此,创建 JobPerformable 所需要做的就是从 AbstractJobPerformable 扩展并实现 perform(CronJobModel CronJob) :
public class ExporterJob extends AbstractJobPerformable<ExporterCronJobModel> {
@Override
public PerformResult perform(ExporterCronJobModel exporterCronJob) {
try {
//get inputs from the Cronjob...
CatalogVersionModel catalogVersion = exporterCronJob.getCalaogVersion();
//do logic...
exportProducts(catalogVersion);
//end of logic...
//return Success (output)...
return new PerformResult(CronJobResult.SUCCESS, CronJobStatus.FINISHED);
} catch(Exception e) {
//return Failure (output)...
return new PerformResult(CronJobResult.FAILURE, CronJobStatus.ABORTED);
}
}
}
- 我们需要将
JobPerformable 注册为 Spring bean:
<bean id="ExporterJob" class="com.foo.bar.ExporterJob" parent="abstractJobPerformable" />
-
JobPerformable 应附加到 ServicelayerJob 的实例:
通过 impex :
INSERT_UPDATE ServicelayerJob ;code[unique=true] ;springId
;ExporterJob ;ExporterJob
或通过 HMC:
- 最后将作业 ExporterJob 附加到 Cronjob ExporterCronJob 并运行您的 Cronjob :)
通过 impex :
$productCatalog= ...
$Version= ...
INSERT_UPDATE ExporterCronJob; code[unique=true] ;job(code) ;catalogVersion(catalog(id),version) ;sessionLanguage(isocode) ;sessionUser(uid)
;exporterCronJob ;ExporterJob ;$productCatalog:$Version ;en ;admin
编辑:http://www.stackextend.com/hybris/everything-about-cronjobs-in-hybris-part-1/