cancel
Showing results for 
Search instead for 
Did you mean: 

how to start workflow using java

pamela
Champ in-the-making
Champ in-the-making
what if i already have a defined and deployed workflow and i just want to start it automatically using java?
  could my java file just contain all the details needed for the workflow? (admin as the assigned to the task and notified in email)

(we figured out how to upload files from UI (flex) to java then to alfresco already  *modifying the alfresco SDK firstwebclient*, so we're assuming that we can start a workflow too, using java, we just don't know how and where to start) please help… if there ever was a tutorial or some articles that you think could help us please point us there… :cry:
11 REPLIES 11

joko71
Confirmed Champ
Confirmed Champ
Yes you can do this.

The process is roughly, create a package, set up your properties, get the workflow, start a new instance of the workflow.

Here's a snippet of some java code I am working on at the moment that kicks off a new workflow and runs the start task.

I know that your post is old, but my problems are new. Smiley Happy

In Alfresco version 2.1 I had a Java method which started worklow, with ugly workaround where I temporarily gave all rights to the user on whole Company Home.

// create workflow package out of package items
NodeRef packageNodeRef = WorkflowHelper.createWorkflowPackage(packageItemList);

Map<QName, Serializable> parameters = new HashMap<QName, Serializable>();

parameters.put(WorkflowModel.ASSOC_PACKAGE, packageNodeRef);
parameters.put(WorkflowModel.PROP_DESCRIPTION, taskComment);
parameters.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, taskComment);

parameters.put(ContentModel.PROP_OWNER, initiatorUsername);

// if it is workflow with one assignee
if(workflow41AssigneeFlag) {
   logger.debug("Workflow with one assignee.");
   NodeRef nrAssignee = AlfrescoServices.getPersonService().getPerson(assigneeUsernameList.get(0));
   parameters.put(WorkflowModel.ASSOC_ASSIGNEE, nrAssignee);
} else {
   logger.debug("Workflow with multiple assignees.");
   // if it is workflow with multiple assignees
   ArrayList<NodeRef> assignees = new ArrayList<NodeRef>();
               
   for(String assigneeUsername : assigneeUsernameList) {
      NodeRef nrAssignee = AlfrescoServices.getPersonService().getPerson(assigneeUsername);
            
      if(nrAssignee != null) {
         assignees.add(nrAssignee);
      }
   }
               
   parameters.put(QName.createQName(BPM_ASSIGNEES_QNAME), assignees);
}

// task start date
parameters.put(WorkflowModel.PROP_START_DATE, new Date());
                              
// task and workflow due date
if(dueDate != null) {
   logger.debug("Due date: " + dueDate);
   parameters.put(WorkflowModel.PROP_DUE_DATE, dueDate);
   parameters.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate);
} else {
   logger.warn("Due date not set.");
}
                              
// set permission on Company Home for initiator
logger.debug("Setting permissions…");
NodeRef nrCompanyHome = WorkflowHelper.setPermissionForUserOnCompanyHomeNode(initiatorUsername, COMPANY_HOME_SET_PERMISSION);
logger.debug("Setting permissions…done.");

// start workflow
logger.debug("Workflow definition Id: " + workflowDefinition.id);

WorkflowPath path = null;

path = AlfrescoServices.getWorkflowService().startWorkflow(workflowDefinition.id, parameters);

// end start task
List<WorkflowTask> tasks = AlfrescoServices.getWorkflowService().getTasksForWorkflowPath(path.id);
WorkflowTask startTask = tasks.get(0);
                        
AlfrescoServices.getWorkflowService().endTask(startTask.id, null);
            
// delete permission on Company Home for initiator
logger.debug("Deleting permissions…");
WorkflowHelper.deletePermissionForUserOnCompanyHomeNode(nrCompanyHome, initiatorUsername, initiatorUsername, COMPANY_HOME_SET_PERMISSION);
logger.debug("Deleting permissions…done.");
            
logger.info(String.format("Workflow %s started by user: %s", workflowName, initiatorUsername));

Code is snipped of a method, and it works in 2.1 version.

But when I put it in 3.2, it does not work, seems like my "magic" with Company Home does not work anymore. I get an error similar to this one (without first line):
http://forums.alfresco.com/en/viewtopic.php?f=34&t=35234

I noticed your post and Java code. I also noticed there is no meddling with permissions, and there are many new parameters unknown to me.

I tried something which worked for me in 2.1 version: I gave manually through web client rights on Company Home to user-initiator, but the error is still the same. Maybe user rights are not the issue after all.

Interesting, the same error occured while I was trying original Ad Hoc workflow from web client:
2011-05-27 09:17:43,351 INFO  [STDOUT] 09:17:43,349 ERROR [ui.common.Utils] A system error happened during the operation: null
java.lang.NullPointerException
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.getCompanyHome(JBPMEngine.java:2675)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.access$300(JBPMEngine.java:129)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine$11.doInJbpm(JBPMEngine.java:686)
   at org.springmodules.workflow.jbpm31.JbpmTemplate$1.doInHibernate(JbpmTemplate.java:87)
   at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
   at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:338)
   at org.springmodules.workflow.jbpm31.JbpmTemplate.execute(JbpmTemplate.java:80)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.startWorkflow(JBPMEngine.java:668)
   at org.alfresco.repo.workflow.WorkflowServiceImpl.startWorkflow(WorkflowServiceImpl.java:330)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)


Maybe something is wrong with the system, JBPM jars?

Can you please elaborate your code, explain the function of parameters which go into Map, and how come there is no messing with properties which was necessary before? Smiley Happy

narasimha
Champ in-the-making
Champ in-the-making
Hi,

Getting below error while starting new work flow,

error msg

Caused by: org.alfresco.service.namespace.NamespaceException: Namespace prefix stmwf is not mapped to a namespace URI
        at org.alfresco.service.namespace.QName.createQName(QName.java:99)
        at org.alfresco.service.namespace.QName.createQName(QName.java:121)
        at org.alfresco.repo.workflow.WorkflowQNameConverter.convertNameToQName(WorkflowQNameConverter.java:103)
        at org.alfresco.repo.workflow.WorkflowQNameConverter.convertNameToQName(WorkflowQNameConverter.java:85)
        at org.alfresco.repo.workflow.WorkflowQNameConverter.mapNameToQName(WorkflowQNameConverter.java:71)
        at org.alfresco.repo.workflow.WorkflowObjectFactory.getTaskTypeDefinition(WorkflowObjectFactory.java:409)
        at org.alfresco.repo.workflow.WorkflowObjectFactory.createTaskDefinition(WorkflowObjectFactory.java:209)
        at org.alfresco.repo.workflow.activiti.ActivitiTypeConverter.getTaskDefinition(ActivitiTypeConverter.java:155)
        at org.alfresco.repo.workflow.activiti.ActivitiTypeConverter.convert(ActivitiTypeConverter.java:144)
        at org.alfresco.repo.workflow.activiti.ActivitiTypeConverter.convert(ActivitiTypeConverter.java:311)
        at org.alfresco.repo.workflow.activiti.ActivitiTypeConverter.convert(ActivitiTypeConverter.java:285)
        at org.alfresco.repo.workflow.activiti.ActivitiTypeConverter.filterByDomainAndConvert(ActivitiTypeConverter.java:99)
        at org.alfresco.repo.workflow.activiti.ActivitiWorkflowEngine.getValidWorkflowDefinitions(ActivitiWorkflowEngine.java:1133)
        at org.alfresco.repo.workflow.activiti.ActivitiWorkflowEngine.getDefinitions(ActivitiWorkflowEngine.java:547)
        at org.alfresco.repo.workflow.WorkflowServiceImpl.getDefinitions(WorkflowServiceImpl.java:293)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
        at org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor.invoke(AlwaysProceedMethodInterceptor.java:34)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:46)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:147)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
        at $Proxy71.getDefinitions(Unknown Source)
        at org.alfresco.repo.web.scripts.workflow.WorkflowDefinitionsGet.buildModel(WorkflowDefinitionsGet.java:52)
        at org.alfresco.repo.web.scripts.workflow.AbstractWorkflowWebscript.executeImpl(AbstractWorkflowWebscript.java:80)
        at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:64)
        … 25 more
Sep 11, 2013 12:14:15 PM org.quartz.core.JobRunShell run
SEVERE: Job Solr.CoreTracker-alfresco threw an unhandled Exception:
org.alfresco.error.AlfrescoRuntimeException: 08117594 GetModelsDiff return status is 302
        at org.alfresco.solr.client.SOLRAPIClient.getModelsDiff(SOLRAPIClient.java:1010)
        at org.alfresco.solr.tracker.CoreTracker.trackModels(CoreTracker.java:1630)
        at org.alfresco.solr.tracker.CoreTracker.trackRepository(CoreTracker.java:1134)
        at org.alfresco.solr.tracker.CoreTracker.updateIndex(CoreTracker.java:491)