在狂妄自大中,克伦工作和工作有什么区别?
<!-- Cron Job -->
<itemtype code="DemoCronJob" extends="CronJob"
autocreate="true" generate="true">
<!-- Job -->
<itemtype code="DemoCronJob" extends="Job"
autocreate="true" generate="true">两者的创建/实现有什么区别?
发布于 2017-01-29 21:40:30
下图描述了Jobs/Cronjobs如何在海布里工作的完整视图,我们将把它作为一个起点来解释Job和Cronjob之间的区别。

正如Car需要Engine工作一样,Cronjob也需要Job。正如没有引擎的汽车不再是一辆汽车一样,没有Job的Job也不再是什么了。
Job是这个等式中有意识的元素,它定义了要由Cronjob执行的逻辑。同时,Cronjob是Job和Users之间的中间部分,用户可以通过Cronjob发送信息(优先级、触发器、节点、…)。和订单(开始、停止、中止、…)为了使Job正常工作,Job可以显示消息(数据、状态、结果、日志、…)。也可以通过Cronjob发送给用户。
我相信最有效的学习方法是通过例子,所以让我们做一个:
世界上最需要的Hybris之一是创建一个Cronjob,该Cronjob导出所选catalogVersion的所有products。
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并不总是那么明显,因为您必须处理Jalos,而我讨厌Jalos :p幸运的是,海布里拥有另一种无需使用Job就可以创建Jalos的方法,我们将在稍后讨论它。
创建Job的传统方法是问题中提出的方法,即创建一个从JobModel扩展的item,并在创建的item的相应Jalo中实现方法performCronJob(CronJob cronJob),并使所有的逻辑都在这个方法中实现。
我以前从未使用过这种方法,所以推荐的方法是使用ServicelayerJobModel,ServicelayerJobModel已经在扩展JobModel并为您实现performCronJob(CronJob cronJob)。
ServicelayerJobModel是如何工作的?它通过SpringID引用一个SpringID,然后执行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 id="ExporterJob" class="com.foo.bar.ExporterJob" parent="abstractJobPerformable" />JobPerformable应该附加到ServicelayerJob的一个实例:通过impex:
INSERT_UPDATE ServicelayerJob ;code[unique=true] ;springId
;ExporterJob ;ExporterJob或通过HMC:

通过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/
发布于 2017-01-30 15:14:28
Cron作业是处理配置、触发器、日志和执行结果的容器,没有逻辑。
作业也不包含任何逻辑,它只引用springId。如果是ServicelayerJob,则引用Spring定义。
Spring包含逻辑。这个bean应该扩展abstractJobPerformable,这样您就不会定义一个新的项。您继续使用Servicelayerjob类型,扩展abstractJobPerformable的所有bean都可以在任何cron作业中使用。
在您的示例中,从items.xml中删除下面一行
<itemtype code="DemoCronJob" extends="Job"
autocreate="true" generate="true">` 相反,将其添加到spring.xml中
<bean id="demoJobPerformable" class="com.foo.bar.DemoJobPerformable" parent="abstractJobPerformable"/>最后,您可以直接连接Impex或hmc/backoffice。
INSERT_UPDATE DemoCronJob;code[unique=true];job(code);sessionLanguage(isocode)
;DemoCronJobNameYouWant;demoJobPerformable;enJUNIT租户中的BUG
上面的impex不会在junit租户中工作(测试是在hy子气6.2中测试)。在impex中,有一部分可以引用作业:job(code)。因此,它希望在那里有一个JobModel集的实例。
在主租户中,一个过滤器或类似的东西使用impex中引用的bean并自动创建一个JobModel实例(实际上是ServicelayerjobModel),其中包含bean的名称和springId的名称(有相同的名称)。
不幸的是,在junit中,这个过滤器似乎在默认情况下不会被激活(我还不知道如何激活它)。因此,创建自己的JobModel实例是管理器。
INSERT_UPDATE ServicelayerJob;code[unique=true];springId
;demoJobPerformable;demoJobPerformableNote
仍然有一些代码在傲慢中使用“遗留”系统。但我认为,现在为每一份工作创建一个新项目并不是一个好做法。
https://stackoverflow.com/questions/41923377
复制相似问题