首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >傲慢中Cron工作与工作的差异

傲慢中Cron工作与工作的差异
EN

Stack Overflow用户
提问于 2017-01-29 16:47:57
回答 2查看 4.1K关注 0票数 2

在狂妄自大中,克伦工作和工作有什么区别?

代码语言:javascript
复制
<!-- Cron Job -->
<itemtype code="DemoCronJob" extends="CronJob"
      autocreate="true" generate="true">

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-01-29 21:40:30

下图描述了Jobs/Cronjobs如何在海布里工作的完整视图,我们将把它作为一个起点来解释JobCronjob之间的区别。

正如Car需要Engine工作一样,Cronjob也需要Job。正如没有引擎的汽车不再是一辆汽车一样,没有JobJob也不再是什么了。

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

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

世界上最需要的Hybris之一是创建一个Cronjob,该Cronjob导出所选catalogVersion的所有products

  1. 首先,让我们创建Cronjob,在Cronjob中我们将定义将发送给Job输入
代码语言:javascript
复制
<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并不总是那么明显,因为您必须处理Jalos,而我讨厌Jalos :p

幸运的是,海布里拥有另一种无需使用Job就可以创建Jalos的方法,我们将在稍后讨论它。

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

我以前从未使用过这种方法,所以推荐的方法是使用ServicelayerJobModelServicelayerJobModel已经在扩展JobModel并为您实现performCronJob(CronJob cronJob)

ServicelayerJobModel是如何工作的?它通过SpringID引用一个SpringID,然后执行JobPerformable中定义的逻辑。

因此,我们创建JobPerformable所需要做的就是从AbstractJobPerformable扩展并实现perform(CronJobModel CronJob)

代码语言:javascript
复制
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:
代码语言:javascript
复制
<bean id="ExporterJob" class="com.foo.bar.ExporterJob" parent="abstractJobPerformable" />
  1. JobPerformable应该附加到ServicelayerJob的一个实例:

通过impex

代码语言:javascript
复制
INSERT_UPDATE ServicelayerJob  ;code[unique=true]  ;springId
;ExporterJob  ;ExporterJob

或通过HMC

  1. 最后,将作业ExporterCronJob附加到ExporterJob,并运行您的Cronjob :)

通过impex

代码语言:javascript
复制
$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/

票数 8
EN

Stack Overflow用户

发布于 2017-01-30 15:14:28

Cron作业是处理配置、触发器、日志和执行结果的容器,没有逻辑。

作业也不包含任何逻辑,它只引用springId。如果是ServicelayerJob,则引用Spring定义。

Spring包含逻辑。这个bean应该扩展abstractJobPerformable,这样您就不会定义一个新的项。您继续使用Servicelayerjob类型,扩展abstractJobPerformable的所有bean都可以在任何cron作业中使用。

在您的示例中,从items.xml中删除下面一行

代码语言:javascript
复制
<itemtype code="DemoCronJob"  extends="Job" 
  autocreate="true" generate="true">` 

相反,将其添加到spring.xml中

代码语言:javascript
复制
<bean id="demoJobPerformable" class="com.foo.bar.DemoJobPerformable" parent="abstractJobPerformable"/>

最后,您可以直接连接Impex或hmc/backoffice。

代码语言:javascript
复制
INSERT_UPDATE DemoCronJob;code[unique=true];job(code);sessionLanguage(isocode)
;DemoCronJobNameYouWant;demoJobPerformable;en

JUNIT租户中的BUG

上面的impex不会在junit租户中工作(测试是在hy子气6.2中测试)。在impex中,有一部分可以引用作业:job(code)。因此,它希望在那里有一个JobModel集的实例。

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

不幸的是,在junit中,这个过滤器似乎在默认情况下不会被激活(我还不知道如何激活它)。因此,创建自己的JobModel实例是管理器。

代码语言:javascript
复制
INSERT_UPDATE ServicelayerJob;code[unique=true];springId
;demoJobPerformable;demoJobPerformable

Note

仍然有一些代码在傲慢中使用“遗留”系统。但我认为,现在为每一份工作创建一个新项目并不是一个好做法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41923377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档