【问题标题】:Difference between Cron Job and Job in HybrisHybris 中 Cron Job 和 Job 的区别
【发布时间】:2017-06-14 20:53:51
【问题描述】:

Cron Job 和 hybris 中的 Job 有什么区别?

<!-- Cron Job -->
<itemtype code="DemoCronJob" extends="CronJob"
      autocreate="true" generate="true">

<!-- Job -->
<itemtype code="DemoCronJob"  extends="Job" 
      autocreate="true" generate="true">

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

【问题讨论】:

    标签: java spring cron jobs hybris


    【解决方案1】:

    下图描述了Jobs/Cronjobs在Hybris中如何工作的完整视图,我们将以此为起点解释JobCronjob之间的区别。

    由于Car 需要Engine 才能工作,Cronjob 也需要Job。就像没有引擎的汽车不再是汽车一样,没有JobCronjob 什么都不是。

    Job 是这个等式中的有意识元素,它定义了Cronjob 要执行的逻辑。 同时CronjobJobUsers之间的中间,通过Cronjob用户可以发送信息(优先级、触发器、节点...)和命令(启动、停止、中止...)到Job 正常工作,Job 也可以通过Cronjob 向用户显示消息(数据、状态、结果、日志……)。

    我相信最有效的学习方法是通过例子,所以让我们做一个:

    世界上对Hybris 最多的要求之一是创建一个Cronjob,以导出选定catalogVersion 的所有products

    1. 首先,让我们创建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>
    
    1. 接下来是让 Job 保存导出的逻辑,但是创建Job 并不总是那么明显,因为你必须处理Jalos 而我讨厌Jalos :p

    幸运的是,Hybris 拥有另一种创建Job 的方法,而无需使用Jalos,我们稍后会介绍。

    创建Job的传统方法是问题中提出的一种方法,即创建一个从JobModel扩展的item,并在创建的item对应的Jalo中实现该方法performCronJob(CronJob cronJob) 并在此方法中创建所有逻辑。

    我以前从未使用过这种方法,所以推荐的方法是使用ServicelayerJobModelServicelayerJobModel 已经扩展了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);
            }
        }
    }
    
    1. 我们需要将 JobPerformable 注册为 Spring bean:
    <bean id="ExporterJob" class="com.foo.bar.ExporterJob" parent="abstractJobPerformable" />
    
    1. JobPerformable 应附加到 ServicelayerJob 的实例:

    通过 impex

    INSERT_UPDATE ServicelayerJob  ;code[unique=true]  ;springId
    ;ExporterJob  ;ExporterJob
    

    或通过 HMC

    1. 最后将作业 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/

    【讨论】:

      【解决方案2】:

      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 中的错误

      impex 之上无法在 junit 租户中工作(在 hybris 6.2 中测试)。在 impex 中,有一个部分可以引用作业:job(code)。所以它希望在那里设置一个 JobModel 的实例。

      在主租户中,过滤器或类似的东西获取impex中引用的bean并自动创建一个带有bean名称和springId名称的JobModel实例(实际上是ServicelayerjobModel)(有相同的) .

      不幸的是,在 junit 中,这个过滤器似乎默认没有被激活(我还不知道如何激活它)。所以必须自己创建 JobModel 的实例。

      INSERT_UPDATE ServicelayerJob;code[unique=true];springId
      ;demoJobPerformable;demoJobPerformable
      

      注意

      hybris 中仍有代码使用“遗留”系统。但我认为现在为每个工作创建一个新项目并不是一个好习惯。

      【讨论】:

        猜你喜欢
        • 2015-07-11
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 2018-05-21
        • 2016-03-27
        相关资源
        最近更新 更多