hybris的Cron Job和Job之间有什么区别?
<!-- Cron Job -->
<itemtype code="DemoCronJob" extends="CronJob"
autocreate="true" generate="true">
<!-- Job -->
<itemtype code="DemoCronJob" extends="Job"
autocreate="true" generate="true">
两者的创建/实施有什么区别?
答案 0 :(得分:6)
下图描述了Jobs/Cronjobs
在Hybris中的工作原理的完整视图,我们将其作为解释Job
和Cronjob
之间差异的起点。
由于Car
需要Engine
才能正常工作,Cronjob
也需要Job
。除了没有引擎的汽车不再是汽车,没有Cronjob
的{{1}}也不算什么。
Job
是该等式中的有意识元素,它定义了Job
要执行的逻辑。
同时Cronjob
是Cronjob
和Job
之间的中间人,通过Users
用户可以发送信息(优先级,触发器,节点......)和订单(开始,停止,中止,...)Cronjob
正常工作,Job
也可以通过Job
向用户显示消息(数据,状态,结果,日志......)。 / p>
我认为最有效的学习方式是通过实例,所以让我们做一个:
最Cronjob
世界要求之一是创建Hybris
,导出所选Cronjob
的所有products
。
catalogVersion
我们将定义我们将发送给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
:p 幸运的是,Hybris拥有另一种不使用Jalos
创建Job
的方法,我们稍后会介绍。
创建Jalos
的传统方式是问题中提供的方法,即创建Job
,其范围从item
延伸到相应的JobModel
创建的Jalo
实现方法item
并在此方法中创建所有逻辑。
我之前从未使用过此方法,因此推荐的方法是使用performCronJob(CronJob cronJob)
,ServicelayerJobModel
已经扩展ServicelayerJobModel
并为您实施JobModel
。
performCronJob(CronJob cronJob)
如何运作?它通过它ServicelayerJobModel
引用JobPerformable
,然后执行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);
}
}
}
注册为Spring bean:JobPerformable
<bean id="ExporterJob" class="com.foo.bar.ExporterJob" parent="abstractJobPerformable" />
应附加到JobPerformable
:通过impex :
ServicelayerJob
或通过HMC :
通过impex :
INSERT_UPDATE ServicelayerJob ;code[unique=true] ;springId
;ExporterJob ;ExporterJob
修改:http://www.stackextend.com/hybris/everything-about-cronjobs-in-hybris-part-1/
答案 1 :(得分:0)
cronjob是处理配置,触发器,日志和执行结果的容器,没有逻辑。
作业也不包含任何逻辑,它只引用springId
。如果它是ServicelayerJob
,则引用Spring bean定义。
Spring bean包含逻辑。此bean应扩展abstractJobPerformable
,这样您就不会定义新项。您继续使用Servicelayerjob
类型,所有扩展abstractJobPerformable
的bean都可以在任何cronjob中使用。
在您的例子中,从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;en
JUNIT TENANT BUG
以上impex在junit tenant中工作(在hybris 6.2中测试)。在impex中,有一部分可以参考这个工作:job(code)
。因此,它希望在那里设置一个JobModel实例。
在主租户中,过滤器或类似的东西采用impex中引用的bean,并自动创建一个JobModel实例(实际上是ServicelayerjobModel),其中包含bean的名称和springId的名称(有相同的名称)
不幸的是,在junit中,这个过滤器默认情况下似乎没有激活(我还不知道如何激活它)。所以它的强制要求就是自己创建JobModel的实例。
INSERT_UPDATE ServicelayerJob;code[unique=true];springId
;demoJobPerformable;demoJobPerformable
注意强>
hybris中仍有代码使用&#34;遗产&#34;系统。但我认为现在为每个工作创建一个新项目并不是一个好习惯。