【问题标题】:Can not see cronjob in backoffice on hybris在 hybris 的后台看不到 cronjob
【发布时间】:2018-04-10 06:32:00
【问题描述】:

我想创建自定义 CronJob。我关注了this tutorial,但不幸的是,我无法在后台看到我的工作实例。

*-item.xml

        <typegroup name="Jobs">
        <itemtype
                generate="true"
                code="UsersFindCronJob"
                extends="CronJob"
                jaloclass="de.hybris.training.core.jalo.UsersFindCronJob"
                autocreate="true">
            <attributes>

                <attribute qualifier="firstName" type="java.lang.String">
                    <modifiers/>
                    <persistence type="property"/>
                </attribute>

            </attributes>
        </itemtype>
    </typegroup>

*spring.xml

<bean id="usersFindJob" class="de.hybris.training.core.job.UsersFindJob"
parent="abstractJobPerformable"/>

UsersFindJob.java

    package de.hybris.training.core.job;

        import de.hybris.platform.cronjob.enums.CronJobResult;
        import de.hybris.platform.cronjob.enums.CronJobStatus;
        import de.hybris.platform.servicelayer.cronjob.AbstractJobPerformable;
        import de.hybris.platform.servicelayer.cronjob.PerformResult;
        import de.hybris.training.core.model.UsersFindCronJobModel;

public class UsersFindJob extends AbstractJobPerformable<UsersFindCronJobModel> {

        @Override
        public PerformResult perform(UsersFindCronJobModel cronJobModel) {
                try {
                        // Retrieve firstName from the cronJob
                        String firstName = cronJobModel.getFirstName();

                        // Display Hello firstName
                        System.out.println("Hello " + firstName);

                        // In case of success return result: SUCCESS and status: FINISHED
                        return new PerformResult(CronJobResult.SUCCESS, CronJobStatus.FINISHED);

                } catch(Exception e) {

                        // In case of exception return result: ERROR and status: ABORTED
                        return new PerformResult(CronJobResult.ERROR, CronJobStatus.ABORTED);

                }
        }
}

自动生成的用户FindCronJobModel

/*
 * ----------------------------------------------------------------
 * --- WARNING: THIS FILE IS GENERATED AND WILL BE OVERWRITTEN! ---
 * --- Generated at 09.Nis.2018 22:52:22                        ---
 * ----------------------------------------------------------------
 *  
 * [y] hybris Platform
 *  
 * Copyright (c) 2000-2016 SAP SE
 * All rights reserved.
 *  
 * This software is the confidential and proprietary information of SAP
 * Hybris ("Confidential Information"). You shall not disclose such
 * Confidential Information and shall use it only in accordance with the
 * terms of the license agreement you entered into with SAP Hybris.
 *  
 */
package de.hybris.training.core.model;

import de.hybris.bootstrap.annotations.Accessor;
import de.hybris.platform.core.model.ItemModel;
import de.hybris.platform.cronjob.model.CronJobModel;
import de.hybris.platform.cronjob.model.JobModel;
import de.hybris.platform.servicelayer.model.ItemModelContext;

/**
 * Generated model class for type UsersFindCronJob first defined at extension trainingcore.
 */
@SuppressWarnings("all")
public class UsersFindCronJobModel extends CronJobModel
{
    /**<i>Generated model type code constant.</i>*/
    public static final String _TYPECODE = "UsersFindCronJob";

    /** <i>Generated constant</i> - Attribute key of <code>UsersFindCronJob.firstName</code> attribute defined at extension <code>trainingcore</code>. */
    public static final String FIRSTNAME = "firstName";


    /**
     * <i>Generated constructor</i> - Default constructor for generic creation.
     */
    public UsersFindCronJobModel()
    {
        super();
    }

    /**
     * <i>Generated constructor</i> - Default constructor for creation with existing context
     * @param ctx the model context to be injected, must not be null
     */
    public UsersFindCronJobModel(final ItemModelContext ctx)
    {
        super(ctx);
    }

    /**
     * <i>Generated constructor</i> - Constructor with all mandatory attributes.
     * @deprecated since 4.1.1 Please use the default constructor without parameters
     * @param _job initial attribute declared by type <code>CronJob</code> at extension <code>processing</code>
     */
    @Deprecated
    public UsersFindCronJobModel(final JobModel _job)
    {
        super();
        setJob(_job);
    }

    /**
     * <i>Generated constructor</i> - for all mandatory and initial attributes.
     * @deprecated since 4.1.1 Please use the default constructor without parameters
     * @param _job initial attribute declared by type <code>CronJob</code> at extension <code>processing</code>
     * @param _owner initial attribute declared by type <code>Item</code> at extension <code>core</code>
     */
    @Deprecated
    public UsersFindCronJobModel(final JobModel _job, final ItemModel _owner)
    {
        super();
        setJob(_job);
        setOwner(_owner);
    }


    /**
     * <i>Generated method</i> - Getter of the <code>UsersFindCronJob.firstName</code> attribute defined at extension <code>trainingcore</code>. 
     * @return the firstName
     */
    @Accessor(qualifier = "firstName", type = Accessor.Type.GETTER)
    public String getFirstName()
    {
        return getPersistenceContext().getPropertyValue(FIRSTNAME);
    }

    /**
     * <i>Generated method</i> - Setter of <code>UsersFindCronJob.firstName</code> attribute defined at extension <code>trainingcore</code>. 
     *  
     * @param value the firstName
     */
    @Accessor(qualifier = "firstName", type = Accessor.Type.SETTER)
    public void setFirstName(final String value)
    {
        getPersistenceContext().setPropertyValue(FIRSTNAME, value);
    }

}

自动生成的 GeneratedUsersFindCronJob

    /*
 * ----------------------------------------------------------------
 * --- WARNING: THIS FILE IS GENERATED AND WILL BE OVERWRITTEN! ---
 * --- Generated at 09.Nis.2018 22:52:22                        ---
 * ----------------------------------------------------------------
 *  
 * [y] hybris Platform
 *  
 * Copyright (c) 2000-2016 SAP SE
 * All rights reserved.
 *  
 * This software is the confidential and proprietary information of SAP
 * Hybris ("Confidential Information"). You shall not disclose such
 * Confidential Information and shall use it only in accordance with the
 * terms of the license agreement you entered into with SAP Hybris.
 *  
 */
package de.hybris.training.core.jalo;

import de.hybris.platform.cronjob.jalo.CronJob;
import de.hybris.platform.jalo.Item.AttributeMode;
import de.hybris.platform.jalo.SessionContext;
import de.hybris.training.core.constants.TrainingCoreConstants;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Generated class for type {@link de.hybris.training.core.jalo.UsersFindCronJob UsersFindCronJob}.
 */
@SuppressWarnings({"deprecation","unused","cast","PMD"})
public abstract class GeneratedUsersFindCronJob extends CronJob
{
    /** Qualifier of the <code>UsersFindCronJob.firstName</code> attribute **/
    public static final String FIRSTNAME = "firstName";
    protected static final Map<String, AttributeMode> DEFAULT_INITIAL_ATTRIBUTES;
    static
    {
        final Map<String, AttributeMode> tmp = new HashMap<String, AttributeMode>(CronJob.DEFAULT_INITIAL_ATTRIBUTES);
        tmp.put(FIRSTNAME, AttributeMode.INITIAL);
        DEFAULT_INITIAL_ATTRIBUTES = Collections.unmodifiableMap(tmp);
    }
    @Override
    protected Map<String, AttributeMode> getDefaultAttributeModes()
    {
        return DEFAULT_INITIAL_ATTRIBUTES;
    }

    /**
     * <i>Generated method</i> - Getter of the <code>UsersFindCronJob.firstName</code> attribute.
     * @return the firstName
     */
    public String getFirstName(final SessionContext ctx)
    {
        return (String)getProperty( ctx, FIRSTNAME);
    }

    /**
     * <i>Generated method</i> - Getter of the <code>UsersFindCronJob.firstName</code> attribute.
     * @return the firstName
     */
    public String getFirstName()
    {
        return getFirstName( getSession().getSessionContext() );
    }

    /**
     * <i>Generated method</i> - Setter of the <code>UsersFindCronJob.firstName</code> attribute. 
     * @param value the firstName
     */
    public void setFirstName(final SessionContext ctx, final String value)
    {
        setProperty(ctx, FIRSTNAME,value);
    }

    /**
     * <i>Generated method</i> - Setter of the <code>UsersFindCronJob.firstName</code> attribute. 
     * @param value the firstName
     */
    public void setFirstName(final String value)
    {
        setFirstName( getSession().getSessionContext(), value );
    }

}

Impex

INSERT_UPDATE UsersFindCronJob ; code[unique=true] ; job(code) ; firstName ; usersFindCronJob ; usersFindJob ; Mouad

我也尝试导入该 Impex,但它说它无效。

【问题讨论】:

  • 是的,Impex 似乎无效,请参考我的回答

标签: cron jobs hybris


【解决方案1】:

我认为您只是错过了更新系统。然后,您可以使用 Impex 下面或通过 Backoffice 创建您的作业实例。

更新

  • 蚂蚁清理所有
  • hybrisserver.bat
  • 打开 HAC (https://localhost:9002/hac/)
  • 转到Platform &gt; Update
  • 仅选中Update running system 复选框和扩展程序的基本数据。

    如果您无法运行基本数据(例如生产),则需要在更新后显式运行 ServiceLayerJob

  • 点击更新按钮

运行 Impex

INSERT_UPDATE UsersFindCronJob ; code[unique=true] ; job(code)    ; firstName ;  
                               ; usersFindCronJob  ; usersFindJob ; Mouad     ;  

您没有运行需要在 Impex 下运行的基本数据的情况(如 @Johannes 所述)

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

参考https://wiki.hybris.com/display/R5T/Trail+~+CronJobs

【讨论】:

  • 试试https://localhost:9002/hac/http://localhost:9001/hac/。希望您没有更改 hac 的网络上下文
  • 确保在更新系统时选择您的扩展程序的essential data 或运行@JohannesNolte 提到的ServicelayerJob
  • Hac 没有被打开,但我可以转到我从后台发布的那个网址。
  • 如果您能够在 Backoffice 中看到您的工作,您可以运行它并完成。否则,您需要更新您的系统,如果您遇到更新问题,您可以简单地使用控制台运行ant updatesystem 并启动服务器。注意:- 这可能会覆盖您的动态数据更改(wcms、目录等)
【解决方案2】:

首先,您需要通过新行将 impex 标头与数据分开:

INSERT_UPDATE UsersFindCronJob;code[unique=true];job(code);firstName
;usersFindCronJob;usersFindJob;Mouad

那么您也错过了创建作业本身的部分:

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

【讨论】:

  • 由于您已经创建了一个实现 JobPerformable 接口的类,您不必创建服务层作业。在基本数据创建阶段,对于实现 JobPerformable 接口的类的每个 Spring 定义,都会创建一个 ServicelayerJob 实例,并将作业的 code 属性设置为 Spring bean 的名称。请通过wiki.hybris.com/display/R5T/Trail+~+CronJobs了解有关此的更多信息
  • 在长期项目中,使用基本数据创建并不总是一种选择。在某些项目中,它甚至会对生产环境造成损害。
  • 是的,同意,在这种情况下,这将是一个选项。这里@vega 正在尝试初始商店设置,所以我只是提到了它。
  • 我第一次使用INSERT_UPDATE ServicelayerJob ;code[unique=true] ;springId ;helloWorldJob ;helloWorldJob,现在我可以看到我的工作了。谢谢你们俩
【解决方案3】:

当您创建自定义 cronjob 时,您需要更新您创建的“自定义 Cronjob”。

****我们做的错误是在编写自定义 cronjob 时更新以下语句:**** INSERT_UPDATE ServicelayerJob;code[unique=true];springId;

INSERT_UPDATE Cronjob;code[unique=true];job(code);singleExecutable;sessionLanguage(isocode) ****实际上我们需要编写以下语句:****

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

INSERT_UPDATE ;code[unique=true];job(code);singleExecutable;sessionLanguage(isocode)

请注意,如果您在自定义 cronjob 中添加的属性是强制性的,那么您还需要更新这些属性,例如:

INSERT_UPDATE ;code[unique=true];job(code);singleExecutable;sessionLanguage(isocode);

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 2021-03-27
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多