2015-04-27 57 views
1

我正在製作一個使用Activiti的網絡應用程序,該應用程序有兩個並行任務,我希望用戶能夠一次完成。我不太清楚如何做到這一點。我已經提出了提交一個大型表單的想法,然後將分裂在服務器上,但我不知道如何去做這件事。我理想地一次提交兩份表格似乎是合乎邏輯的方式,但我不確定這是否可能。JSP Servlet/Activiti - 是否有辦法一次完成2個任務一次完成2個任務?

我的JSP形式:

<form action="CompleteTask" method="post"> 
        <c:forEach items="${formProperties}" var="property" varStatus="status"> 
         ${property.getName()}: 
         <br /> 
         <c:set var="type" value="${property.getType().getName()}" /> 
          <c:if test="${type == 'string'}"> 
           <c:if test="${property.isRequired() == 'true' }"> 
            <input type="text" name="${property.getId()}" value="${property.getValue()}" required /><br /> 
           </c:if> 
           <c:if test="${property.isRequired() == 'false' }"> 
            <input type="text" name="${property.getId()}" value="" /><br /> 
           </c:if> 
          </c:if> 
          <c:if test="${type == 'long'}"> 
           <c:if test="${property.isRequired() == 'true' }"> 
            <input type="text" name="${property.getId()}" value="${property.getValue()}" required /><br /> 
           </c:if> 
           <c:if test="${property.isRequired() == 'false' }"> 
            <input type="text" name="${property.getId()}" value="" /><br /> 
           </c:if> 
          </c:if> 
          <c:if test="${type == 'date'}"> 
           <c:if test="${property.isRequired() == 'true' }"> 
            <input type="date" name="${property.getId()}" value="" required /><br /> 
           </c:if> 
           <c:if test="${property.isRequired() == 'false' }"> 
            <input type="date" name="${property.getId()}" value="" /><br /> 
           </c:if> 
          </c:if> 
          <c:if test="${type == 'enum'}"> 
           <select name="${property.getId()}"> 
            <c:forEach var="entry" items='${property.getType().getInformation("values")}'> 
             <option value="${entry.key}">${entry.value}</option> 
            </c:forEach> 
           </select><br /><br /> 
          </c:if> 
        </c:forEach> 
        <input type="hidden" id="taskId" name="taskId" value="${taskList.get(0).getId()}" /><br /> 
       </form> 

這種形式是在一個foreach循環,使多個版本均採用取決於有多少任務(在這種情況下2)。爲完成任務

我當前的servlet代碼:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 

     Map<String, Object> params = new HashMap<String, Object>(); 

     Enumeration<String> parameterNames = request.getParameterNames(); 

     while (parameterNames.hasMoreElements()) { 

      String paramName = parameterNames.nextElement(); 

      String[] paramValues = request.getParameterValues(paramName); 

      String paramValue = paramValues[0]; 

      if(!paramName.equals("submit")){ 

       System.out.println(paramName+ " - " + paramValue); 
       params.put(paramName, paramValue); 

      } 

     } 

     String taskId = request.getParameter("taskId"); 

     TaskService taskService = processEngine.getTaskService(); 
     Task t = taskService.createTaskQuery().taskId(taskId).singleResult(); 
     taskService.complete(t.getId(), params); 

回答

1

你是對的 - 這是最好創建一個請求,然後運行在服務器端2個進程。然而,你必須同步這些過程,得到兩個答案,然後將它們組合成一個完整的答案。

另一種方法是撥打2 AJAX來電。但在這種情況下,您必須在客戶端(瀏覽器)端執行類似的同步。

但是,總的來說,更好的方法是簡化您的設計,並提供簡單的單一請求/響應。

0

我不確定需要並行處理但只有一個用戶任務的業務案例。似乎你可以收集你需要的信息並在那之後分支。但是,如果業務邏輯必須使用此模式,那麼BPMN確實支持使用消息/信號的功能。 在其中一條並行路徑上使用單個用戶表單。其他路徑沒有用戶任務,而是等待消息或信號。 然後,在收集您需要的詳細信息後,使用信號發送事件任務來「釋放」其他平行路徑。

相關問題