AEM 6.1 Зависимость Uber Jar Maven

Я использую AEM 6.1 с Maven в качестве менеджера сборки. Я обновил локальную папку .m2 необфусцированным UberJar, предоставленным Adobe. Я получаю следующую ошибку:

ОШИБКА [JobHandler: /etc/workflow/instances/server0/2016-07-15/model_157685507700064:/content/myApp/testing/wf_test01] com.adobe.granite.workflow.core.job.JobHandler Реализация процесса не найдена: com.myApp.workflow.ActivatemyAppPageProcess (HandlerBase.java:197) по адресу com.adobe.granite.workflow.core.job.JobHandler.process(JobHandler.java:232) по адресу org.apache.sling.event.impl.jobs.JobConsumerManager$JobConsumerWrapper.process(JobConsumerManager .java:512) в org.apache.sling.event.impl.jobs.queues.JobRunner.run(JobRunner.java:205) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) в java. util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) на java.lang.Thread.run(Thread.java:745)

У UberJar, похоже, нет пакета com.adobe.granite.workflow.core.job. Есть ли способ решить эту проблему?

Метод .execute для шага процесса ActivatemyAppPageProcess:

public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap args) throws WorkflowException {
    Session participantSession = null;
    Session replicationSession = null;
    // ResourceResolver resourceResolver = null;
    try {
        log.info("Inside ActivatemyAppPageProcess ");
        Session session = workflowSession.getSession();
        if (replicateAsParticipant(args)) {
            String approverId = resolveParticipantId(workItem, workflowSession);
            if (approverId != null) {
                participantSession = getParticipantSession(approverId, workflowSession);
            }
        }
        if (participantSession != null)
            replicationSession = participantSession;
        else {
            replicationSession = session;
        }

        WorkflowData data = workItem.getWorkflowData();
        String path = null;
        String type = data.getPayloadType();
        if ((type.equals("JCR_PATH")) && (data.getPayload() != null)) {
            String payloadData = (String) data.getPayload();
            if (session.itemExists(payloadData))
                path = payloadData;
            }
            else if ((data.getPayload() != null) && (type.equals("JCR_UUID"))) {
                Node node = session.getNodeByUUID((String) data.getPayload());
                path = node.getPath();
            }
            ReplicationOptions opts = null;
            String rev = (String) data.getMetaDataMap().get("resourceVersion", String.class);
            if (rev != null) {
                opts = new ReplicationOptions();
                opts.setRevision(rev);
            }
            opts = prepareOptions(opts);

            if (path != null) {
                ResourceCollection rcCollection = 
                    ResourceCollectionUtil
                        .getResourceCollection(
                            (Node) this.admin.getItem(path), 
                                (ResourceCollectionManager) this.rcManager);
                boolean isWFPackage = isWorkflowPackage(path, resolverFactory, workflowSession);
                List<String> paths = getPaths(path, rcCollection);
                for (String aPath : paths)
                    if (canReplicate(replicationSession, aPath)) {
                        if (opts != null) {
                            if (isWFPackage) {
                                setRevisionForPage(aPath, opts, data);
                            }
                            this.replicator
                                    .replicate(replicationSession, 
                                                   getReplicationType(),
                                                       aPath,
                                                           opts);
                            } else {
                                this.replicator
                                        .replicate(replicationSession, 
                                                       getReplicationType(),
                                                           aPath);
                        }
                    } else {
                        log.debug(session.getUserID() + " is not allowed to replicate " + "this page/asset " + aPath + ". Issuing request for 'replication");

                        Dictionary properties = new Hashtable();
                        properties.put("path", aPath);
                        properties.put("replicationType", getReplicationType());
                        properties.put("userId", session.getUserID());
                        Event event = new Event("com/day/cq/wcm/workflow/req/for/activation", properties);
                        this.eventAdmin.sendEvent(event);
                    }
            } else {
                log.warn("Cannot activate page or asset because path is null for this workitem: " + workItem.toString());
            }
        } catch (RepositoryException e) {
            throw new WorkflowException(e);
        } catch (ReplicationException e) {
            throw new WorkflowException(e);
        } finally {
            if ((participantSession != null) && (participantSession.isLive())) {
                participantSession.logout();
                participantSession = null;
            }
        }
    }

person ItzGatze    schedule 18.07.2016    source источник
comment
Как вы добавили зависимость uber-jar? Можете ли вы добавить копию части вашего pom?   -  person Oliver Gebert    schedule 18.07.2016
comment
Я добавил зависимость от pom следующим образом: › ‹scope›предоставляется‹/scope› ‹/зависимость›   -  person ItzGatze    schedule 18.07.2016
comment
Выглядит правильно. См. мой ответ ниже, пакет просто недоступен.   -  person Oliver Gebert    schedule 18.07.2016
comment
@Redman: Привет и добро пожаловать в stackoverflow - я просмотрел код, который вы включили, и сделал все возможное, чтобы очистить его, но у меня не хватило времени (нужно идти на работу). Никаких претензий или сложностей, просто подсказка: вы захотите убрать вкладки из своего кода при публикации вопроса.   -  person Sean Mickey    schedule 20.07.2016
comment
@ Шон .. Спасибо за руководство .. буду обращать внимание в будущем   -  person ItzGatze    schedule 20.07.2016


Ответы (2)


Возможная причина ошибки может заключаться в том, что ваш рабочий процесс com.myApp.workflow.ActivatemyAppPageProcess сервис/компонент не активен, из-за чего он не привязан к списку доступных процессов JobHandler, что вызывает это исключение.

Можете ли вы проверить /system/console/components, что ваш пользовательский компонент процесса активен? Если нет, вам придется устранить зависимость, из-за которой служба/компонент недоступна.

person Ameesh Trikha    schedule 18.07.2016
comment
мой пользовательский компонент процесса находится в состоянии «удовлетворено». - person ItzGatze; 19.07.2016
comment
Вы имеете в виду, что компонент активен и все зависимости удовлетворены? - person Ameesh Trikha; 19.07.2016
comment
Можете ли вы поделиться снимком информации о компонентах (расширенный) - person Ameesh Trikha; 19.07.2016
comment
Компонент «удовлетворен», но есть ссылочные свойства, которые, похоже, не разрешены - person ItzGatze; 19.07.2016
comment
Ваш процесс должен быть активным, чтобы его можно было вызвать. Эти свойства предоставляются через какой-либо файл конфигурации? Осги конфиг? Есть ли способ предоставить эти свойства, а затем вручную активировать этот компонент? - person Ameesh Trikha; 19.07.2016
comment
У вашего компонента есть немедленное = true в аннотации @Component. Если не добавить, это может решить вашу проблему. Удовлетворенный компонент активируется с задержкой и активируется только при вызове, однако при реализации рабочего процесса, который вы используете, процесс должен быть привязан к JobHandler, а метод связывания вызывается только при активации компонента реализации. - person Ameesh Trikha; 19.07.2016

com.adobe.granite.workflow.core.job вообще не экспортируется в AEM. Это означает, что вы не можете использовать его, потому что он невидим для вашего кода.

Пакет com.adobe.granite.workflow.core экспортирует только com.adobe.granite.workflow.core.event. Если вы работаете с рабочими процессами AEM, вам следует придерживаться пакета com.adobe.granite.workflow.api.

Следующие пакеты экспортируются в этот пакет и поэтому могут использоваться:

com.adobe.granite.workflow,version=1.0.0
com.adobe.granite.workflow.collection,version=1.1.0
com.adobe.granite.workflow.collection.util,version=1.0.0
com.adobe.granite.workflow.event,version=1.0.0
com.adobe.granite.workflow.exec,version=1.0.0
com.adobe.granite.workflow.exec.filter,version=1.0.0
com.adobe.granite.workflow.job,version=1.0.0
com.adobe.granite.workflow.launcher,version=1.0.0
com.adobe.granite.workflow.metadata,version=1.0.0
com.adobe.granite.workflow.model,version=1.0.0
com.adobe.granite.workflow.rule,version=1.0.0
com.adobe.granite.workflow.serialization,version=1.0.0
com.adobe.granite.workflow.status,version=1.0.0

Даже если у uber.jar есть пакеты, если вы посмотрите на свой экземпляр AEM на /system/console/bundles и щелкните пакет com.adobe.granite.workflow.core, вы увидите, что в «экспортированных пакетах» нет доступных com.adobe.granite.workflow.core.job. Таким образом, даже если ваша IDE, Maven и/или Jenkins могут с этим справиться, AEM не сможет выполнить ваш код.

В AEM вы можете использовать только пакеты, экспортированные в один из доступных пакетов или включенные в ваш пакет — что было бы плохой идеей. Тогда у вас будет две версии одного и того же кода, что приведет к дальнейшим проблемам.

Увидев код, я бы сказал, что здесь есть еще одна проблема. И решение этой проблемы поможет вам избавиться и от другой.

Вы пытаетесь запустить другую WF (запрос на активацию) для пути, который уже используется в рабочем процессе. Вы должны завершить текущий экземпляр рабочего процесса, чтобы иметь возможность сделать это.

Пример чистого способа сделать это:

Workflow workflow = workItem.getWorkflow();
WorkflowData wfData = workflow.getWorkflowData();
workflowSession.terminateWorkflow(workflow);
Map<String, Object> paramMap = new HashMap<String, Object>();
if (!StringUtils.isEmpty(data.getNextParticipantUid())) {
    paramMap.put("nextParticipant", "admin");
}
workflowSession.startWorkflow(
    workflowSession.getModel(WORKFLOW_MODEL_PATH, wfData, paramMap);
person Oliver Gebert    schedule 18.07.2016
comment
В банке uber, который я использую, есть упомянутые пакеты ... поэтому использование пакета com.adobe.granite.workflow.api не решает проблему. - person ItzGatze; 18.07.2016
comment
Даже если в uber.jar есть пакеты (я никогда не говорил, что их нет), если вы посмотрите на свой экземпляр AEM в /system/console/bundles и щелкните пакет com.adobe.granite.workflow.core , вы увидите, что в экспортированных пакетах нет com.adobe.granite.workflow.core.job. Таким образом, даже если ваша IDE, Maven и/или Jenkins могут с этим справиться, AEM не сможет выполнить ваш код. - person Oliver Gebert; 18.07.2016
comment
да, имеет смысл .. спасибо за это направление .. но теперь рефакторинг кода для использования экспортированных пакетов, что является подходящей альтернативой службе JobHandler, которая выдает ошибку - person ItzGatze; 19.07.2016
comment
Чем именно вы занимаетесь? «Обработчик заданий» автоматически вызывается из «org.apache.sling.event.jobs.JobManager», если есть задание с одной из тем, для которых зарегистрирован «Обработчик заданий». Поэтому я думаю, что вам не нужно вызывать его вручную. Можете ли вы опубликовать несколько строк кода, возможно, это поможет вам рассказать, как решить проблему. - person Oliver Gebert; 19.07.2016
comment
включил метод выполнения для ActivatemyAppPageProcess в области вопросов - person ItzGatze; 19.07.2016
comment
@OliverGebert - в работу рабочих процессов в AEM 6.1 + были внесены некоторые изменения для повышения производительности. Каждый процесс регистрируется в обработчике процесса (он поддерживает списки всех рабочих процессов). Когда вы запускаете рабочий процесс, внутренне AEM делегирует это JobManager, который вызывает обработчик заданий с ресурсом рабочего процесса (т. е. именем класса процесса). Затем JobHandler просматривает свой список процессов, чтобы соответствовать вызывающему процессу, и, если он найден, выполняет его. В приведенном выше случае он не найден и выброшено исключение. - person Ameesh Trikha; 21.07.2016