2017-07-15 48 views
0

首先,我要感谢每个花时间帮助我解决问题的人,因为我正在寻找一个多星期来解决我的问题。这里是:如何仅使用Java更新露天工作流任务中的自定义属性?

我的目标是在Alfresco Community 5.2中启动自定义工作流程,并通过仅使用公共Java API的Web脚本在第一个任务中设置一些自定义属性。我的课正在扩展AbstractWebScript。目前,我已经成功启动了工作流和设置属性,如bpm:workflowDescription,但我无法在任务中设置自定义属性。

下面是代码:

public class StartWorkflow extends AbstractWebScript { 
    /** 
    * The Alfresco Service Registry that gives access to all public content services in Alfresco. 
    */ 
    private ServiceRegistry serviceRegistry; 

    public void setServiceRegistry(ServiceRegistry serviceRegistry) { 
     this.serviceRegistry = serviceRegistry; 
    } 

    @Override 
    public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException {  

     // Create JSON object for the response 
     JSONObject obj = new JSONObject(); 

     try {       
      // Check if parameter defName is present in the request    
      String wfDefFromReq = req.getParameter("defName"); 
      if (wfDefFromReq == null) { 
       obj.put("resultCode", "1 (Error)"); 
       obj.put("errorMessage", "Parameter defName not found."); 
       return;  
      }    
      // Get the WFL Service 
      WorkflowService workflowService = serviceRegistry.getWorkflowService(); 
      // Build WFL Definition name 
      String wfDefName = "activiti$" + wfDefFromReq; 
      // Get WorkflowDefinition object 
      WorkflowDefinition wfDef = workflowService.getDefinitionByName(wfDefName); 
      // Check if such WorkflowDefinition exists 
      if (wfDef == null) { 
       obj.put("resultCode", "1 (Error)"); 
       obj.put("errorMessage", "No workflow definition found for defName = " + wfDefName); 
       return; 
      }      

      // Get parameters from the request 
      Content reqContent = req.getContent(); 
      if (reqContent == null) { 
       throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Missing request body."); 
      } 
      String content; 
      content = reqContent.getContent(); 

      if (content.isEmpty()) { 
       throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Content is empty"); 
      } 

      JSONTokener jsonTokener = new JSONTokener(content); 
      JSONObject json = new JSONObject(jsonTokener);   

      // Set the workflow description 
      Map<QName, Serializable> params = new HashMap(); 
      params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "Workflow started from JAVA API");   

      // Start the workflow 
      WorkflowPath wfPath = workflowService.startWorkflow(wfDef.getId(), params); 

      // Get params from the POST request 
      Map<QName, Serializable> reqParams = new HashMap(); 
      Iterator<String> i = json.keys(); 
      while (i.hasNext()) { 
       String paramName = i.next(); 
       QName qName = QName.createQName(paramName); 
       String value = json.getString(qName.getLocalName()); 
       reqParams.put(qName, value); 
      } 

      // Try to update the task properties 

      // Get the next active task which contains the properties to update 
      WorkflowTask wfTask = workflowService.getTasksForWorkflowPath(wfPath.getId()).get(0); 
      // Update properties 
      WorkflowTask updatedTask = workflowService.updateTask(wfTask.getId(), reqParams, null, null); 

      obj.put("resultCode", "0 (Success)"); 
      obj.put("workflowId", wfPath.getId()); 

     } catch (JSONException e) { 
      throw new WebScriptException(Status.STATUS_BAD_REQUEST, 
        e.getLocalizedMessage()); 
     } catch (IOException ioe) { 
      throw new WebScriptException(Status.STATUS_BAD_REQUEST, 
        "Error when parsing the request.", 
        ioe); 
     } finally { 
      // build a JSON string and send it back 
      String jsonString = obj.toString(); 
      res.getWriter().write(jsonString); 
     } 

    } 
} 

这里是我所说的webscript:

curl -v -uadmin:admin -X POST -d @postParams.json localhost:8080/alfresco/s/workflow/startJava?defName=nameOfTheWFLDefinition -H "Content-Type:application/json" 

在postParams.json文件我有一个属性/值所需要的对,我需要更新:

{ 
"cmprop:propOne" : "Value 1", 
"cmprop:propTwo" : "Value 2", 
"cmprop:propThree" : "Value 3" 

}

工作流已启动,bpm:workflowDescription设置正确,但任务中的属性不可见,无法设置。

我做了一个JS脚本,我打电话的时候,工作流开始:

execution.setVariable('bpm_workflowDescription', 'Some String ' + execution.getVariable('cmprop:propOne')); 

而实际上对于cmprop值:propOne的使用量和描述是正确更新 - 这意味着,这些属性将某个更新(在执行级别可能?),但我不明白为什么他们不可见时,我打开任务。

我有开始工作流程和更新使用JavaScript API与性能的成功:

if (wfdef) { 

     // Get the params 
     wfparams = {}; 
     if (jsonRequest) { 
      for (var prop in jsonRequest) { 
       wfparams[prop] = jsonRequest[prop]; 
      } 
     } 

     wfpackage = workflow.createPackage(); 

     wfpath = wfdef.startWorkflow(wfpackage, wfparams); 

的问题是,我只希望使用公共的Java API,请帮助。 谢谢!

回答

0

你是否在你的任务中设置变量本地?从我所看到的看来,您似乎是在执行级别定义变量,而不是在州级定义变量。如果你看一看的开箱即用的adhoc.bpmn20.xml文件(https://github.com/Activiti/Activiti-Designer/blob/master/org.activiti.designer.eclipse/src/main/resources/templates/adhoc.bpmn20.xml),你可以看到一个事件侦听器设置局部变量:

<extensionElements> 
    <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
     <activiti:field name="script"> 
      <activiti:string> 
      if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate); 
      if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority; 
      </activiti:string> 
     </activiti:field> 
    </activiti:taskListener> 
</extensionElements> 
+0

我已经试过: '如果(!typeof运算cmprop_propOne = '未定义')task.setVariableLocal( 'cmprop_propOne',execution.getVariable( 'cmprop_propOne') );'但仍然没有成功。我错过了什么? – tmacftw

+0

我试图使用task.setVariable和task.setVariableLocal都没有成功。看起来出于某种原因,在使用javascript时,所有属性在执行和任务级别都可见,但是当我使用Java API时,属性仅在执行级别上可见:另外,'workflowService.updateTask(wfTask.getId(),reqParams,null,null);'出于某种原因也不会使这些属性可见。 – tmacftw

0

通常情况下,我只是尝试导入所有任务我的自定义模型字首。所以对你来说,它应该是一个:

import java.util.Set; 
import org.activiti.engine.delegate.DelegateExecution; 
import org.activiti.engine.delegate.DelegateTask; 
import org.apache.log4j.Logger; 

public class ImportVariables extends AbstractTaskListener { 

    private Logger logger = Logger.getLogger(ImportVariables.class); 

    @Override 
    public void notify(DelegateTask task) { 

     logger.debug("Inside ImportVariables.notify()"); 
     logger.debug("Task ID:" + task.getId()); 
     logger.debug("Task name:" + task.getName()); 
     logger.debug("Task proc ID:" + task.getProcessInstanceId()); 
     logger.debug("Task def key:" + task.getTaskDefinitionKey()); 

     DelegateExecution execution = task.getExecution(); 

     Set<String> executionVariables = execution.getVariableNamesLocal(); 
     for (String variableName : executionVariables) { 
      // If the variable starts by "cmprop_" 
      if (variableName.startsWith("cmprop_")) { 
       // Publish it at the task level 
       task.setVariableLocal(variableName, execution.getVariableLocal(variableName)); 
      } 
     } 
    } 

} 
+0

谢谢你的答案。我试过这个,但是我不得不使用'ImportVariables extends BaseJavaDelegate implements TaskListener'。 其实,在我做了一些更多的测试之后,我发现了一些非常奇怪的东西: 即使没有这个监听器,属性也会被更新,但由于某种原因,Alfresco并没有向他们展示它们?!? 我做了以下测试:使用webscript启动了一个工作流程,然后检查了任务并没有填充任何内容。然后,我刚刚重新启动了应用程序服务器,并在没有执行任何其他操作时检查相同的任务 - 属性可见... – tmacftw

+0

另外,如果我使用webscript启动另一个工作流,则属性会再次消失,以前启动的工作流和新的,直到我重新启动应用程序服务器。重新启动后,这两个工作流的属性在任务中都可见。你或者任何人有一个想法,为什么会发生这种情况? – tmacftw

相关问题