cancel
Showing results for 
Search instead for 
Did you mean: 

any simple way to register an execution listener?

lojian
Champ in-the-making
Champ in-the-making
What I want to do here is to register an execution listener "ONCE" so that
every execution events of all nodes for a process could be sent out.

Thanks in advance…
Smiley Very Happy
5 REPLIES 5

frederikherema1
Star Contributor
Star Contributor
You can use a BPMNParseListener for this, adding your listener to ALL parsed nodes.

see ProcessEngineConfigurationImpl.preParseListeners (invoked before activiti's custom parselisteners) and ProcessEngineConfigurationImpl.postParseListeeners
see org.activiti.engine.impl.bpmn.parser.BpmnParseListener

see example in Alfresco integration http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/jav...

lojian
Champ in-the-making
Champ in-the-making
Cool! I believe it works

Thank you Fred!

You can use a BPMNParseListener for this, adding your listener to ALL parsed nodes.

see ProcessEngineConfigurationImpl.preParseListeners (invoked before activiti's custom parselisteners) and ProcessEngineConfigurationImpl.postParseListeeners
see org.activiti.engine.impl.bpmn.parser.BpmnParseListener

see example in Alfresco integration http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/jav...

lojian
Champ in-the-making
Champ in-the-making
Hi Fred,

I want to use these "internal" interfaces provided by ProcessEngineConfigurationImpl, but
have one concern that since it is "internal", it is possible to be changed in later
release of Activiti?(I do see it has not so high chance :-))

Can you give some comments on this? any suggestions?

Thank you very much!


You can use a BPMNParseListener for this, adding your listener to ALL parsed nodes.

see ProcessEngineConfigurationImpl.preParseListeners (invoked before activiti's custom parselisteners) and ProcessEngineConfigurationImpl.postParseListeeners
see org.activiti.engine.impl.bpmn.parser.BpmnParseListener

see example in Alfresco integration http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/jav...

frederikherema1
Star Contributor
Star Contributor
Hi,

If you configure your engine, it's always using a subclass of ProcessEngineConfigurationImpl (StandalongProcessEngineCI etc.). It's indeed a good point that these method's aren't exposed on the ProcessEngineConfigurtion interface. Probabilly because the parselisteners is internal stuff as well, so makes kind of sense that they are on the *Impl. But it's quite safe I guess to use them Smiley Wink

Anyone other thoughts on this?

frederikherema1
Star Contributor
Star Contributor
As of 5.13 (or even 5.12), it now called parse-handlers. Example in Alfresco:


/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.alfresco.repo.workflow.activiti;

import java.util.ArrayList;
import java.util.List;

import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler;
import org.activiti.engine.impl.pvm.delegate.ActivityBehavior;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.parse.BpmnParseHandler;

/**
* A {@link BpmnParseHandler} that adds execution listeners to a
* {@link UserTask} which are specifically for Alfresco usage.
*
* @author Joram Barrez
* @author Frederik Heremans
* @author Nick Smith
*/
public class AlfrescoUserTaskBpmnParseHandler extends AbstractBpmnParseHandler<UserTask>
{
    private TaskListener      completeTaskListener;
    private TaskListener      createTaskListener;
    private TaskListener      notificationTaskListener;

    protected Class<? extends BaseElement> getHandledType()
    {
        return UserTask.class;
    }

    protected void executeParse(BpmnParse bpmnParse, UserTask userTask)
    {
        ActivityImpl activity = findActivity(bpmnParse, userTask.getId());
        ActivityBehavior activitybehaviour = activity.getActivityBehavior();
        if (activitybehaviour instanceof UserTaskActivityBehavior)
        {
            addListeners((UserTaskActivityBehavior) activity.getActivityBehavior());
        }
        else if(activitybehaviour instanceof MultiInstanceActivityBehavior)
        {
            MultiInstanceActivityBehavior multiInstance = (MultiInstanceActivityBehavior) activitybehaviour;
            if(multiInstance.getInnerActivityBehavior() instanceof UserTaskActivityBehavior)
            {
                addListeners((UserTaskActivityBehavior) multiInstance.getInnerActivityBehavior());
            }
        }
    }
   
    protected void addListeners(UserTaskActivityBehavior activityBehavior)
    {
        if (createTaskListener != null)
        {
            addTaskListenerAsFirst(createTaskListener, TaskListener.EVENTNAME_CREATE, activityBehavior);
        }
        if (completeTaskListener != null)
        {
            addTaskListenerAsFirst(completeTaskListener, TaskListener.EVENTNAME_COMPLETE, activityBehavior);
        }
        if(notificationTaskListener != null)
        {
            addTaskListenerAsLast(notificationTaskListener, TaskListener.EVENTNAME_CREATE, activityBehavior);
        }
    }
   
    public void setCompleteTaskListener(TaskListener completeTaskListener)
    {
        this.completeTaskListener = completeTaskListener;
    }

    public void setCreateTaskListener(TaskListener createTaskListener)
    {
        this.createTaskListener = createTaskListener;
    }
   
    public void setNotificationTaskListener(TaskListener notificationTaskListener)
    {
        this.notificationTaskListener = notificationTaskListener;
    }
   
    protected void addTaskListenerAsFirst(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask)
    {
        getOrCreateListenerList(eventName, userTask).add(0, taskListener);
    }
   
    protected void addTaskListenerAsLast(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask)
    {
        getOrCreateListenerList(eventName, userTask).add(taskListener);
    }
   
    protected List<TaskListener> getOrCreateListenerList(String eventName, UserTaskActivityBehavior userTask)
    {
        List<TaskListener> taskEventListeners = userTask.getTaskDefinition().getTaskListeners().get(eventName);
        if (taskEventListeners == null) {
          taskEventListeners = new ArrayList<TaskListener>();
          userTask.getTaskDefinition().getTaskListeners().put(eventName, taskEventListeners);
        }
        return taskEventListeners;
    }
}