Hybris中Cron工作与工作的区别

时间:2017-01-29 16:47:58

标签: java spring cron jobs hybris

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">

两者的创建/实施有什么区别?

2 个答案:

答案 0 :(得分:6)

下图描述了Jobs/Cronjobs在Hybris中的工作原理的完整视图,我们将其作为解释JobCronjob之间差异的起点。

enter image description here

由于Car需要Engine才能正常工作,Cronjob也需要Job。除了没有引擎的汽车不再是汽车,没有Cronjob的{​​{1}}也不算什么。

Job是该等式中的有意识元素,它定义了Job要执行的逻辑。 同时CronjobCronjobJob之间的中间人,通过Users用户可以发送信息(优先级,触发器,节点......)和订单(开始,停止,中止,...)Cronjob正常工作,Job也可以通过Job向用户显示消息(数据,状态,结果,日志......)。 / p>

我认为最有效的学习方式是通过实例,所以让我们做一个:

Cronjob世界要求之一是创建Hybris,导出所选Cronjob的所有products

  1. 首先,让我们创建 Cronjob ,在catalogVersion我们将定义我们将发送给Cronjob输入
  2. Job
    1. 接下来是让作业保持导出的逻辑,但创建<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
    2. 幸运的是,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)
      1. 我们需要将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:
      2. JobPerformable
        1. <bean id="ExporterJob" class="com.foo.bar.ExporterJob" parent="abstractJobPerformable" /> 应附加到JobPerformable
        2. 的实例

          通过impex

          ServicelayerJob

          或通过HMC

          enter image description here

          1. 最后将作业 ExporterJob 附加到Cronjob ExporterCronJob 并运行您的Cronjob:)
          2. 通过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;系统。但我认为现在为每个工作创建一个新项目并不是一个好习惯。