ECM의 DM_WORKFLOW_E_TRANS_MAX_OUTPUT_CNT_EXCEEDEDED 오류 분석 및 해결

7235 단어
2012-11-10 09:25:51,146 ERROR [STDERR] DfException:: THREAD: http-0.0.0.0-9160-1; MSG: [DM_WORKFLOW_E_TRANS_MAX_OUTPUT_CNT_EXCEEDED]error:  "A maximum of 1 output ports can be selected. (The maximum is defined in the activity's transition_max_output_cnt attribute.)"; ERRORCODE: 100; NEXT: null
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.docbase.DocbaseExceptionMapper.newException(DocbaseExceptionMapper.java:57)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.MessageEntry.getException(MessageEntry.java:39)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.DocbaseMessageManager.getException(DocbaseMessageManager.java:137)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.netwise.NetwiseDocbaseRpcClient.checkForMessages(NetwiseDocbaseRpcClient.java:305)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.netwise.NetwiseDocbaseRpcClient.applyForBool(NetwiseDocbaseRpcClient.java:349)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection$1.evaluate(DocbaseConnection.java:1108)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.evaluateRpc(DocbaseConnection.java:1046)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.applyForBool(DocbaseConnection.java:1101)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.apply(DocbaseConnection.java:1086)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.impl.docbase.DocbaseApi.witemSetOutput(DocbaseApi.java:1240)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.DfWorkitem.setOutput(DfWorkitem.java:406)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.fc.client.DfWorkitem.setOutputByActivities(DfWorkitem.java:879)
2012-11-10 09:25:51,147 ERROR [STDERR] 	at com.documentum.bpm.DfWorkitemEx___PROXY.setOutputByActivities(DfWorkitemEx___PROXY.java)

ECM 스냅 프로세스를 사용할 때 완료 후 위의 오류를 보고합니다.
이상은 잘못된 상세한 상황입니다.
해결 방법:
  • 잘못 보고된 msg를 보면 절차의 수출이 많다.activity에서 정의된 최대 값은 "1"입니다.Process Builder를 통해 이 프로세스 관문의 r_ 찾기object_id, DQL을 사용하여 transition_ 얻기max_output_cnt의 값입니다.select transition_max_output_cnt from dm_activity where r_object_id='4cXXXXXXXXXXXXXXXX'.얻은 값은 "1"으로 제시된 정보와 일치합니다.사실 이 값은 activity 설정 페이지의 Transition tab의 Select up to []next activities 옵션의 괄호 안에 있는 값입니다.
  • 정의된 최대치가 1인 이상 실제 호출할 때 전송된 outputport는 몇 개입니까?아웃풋 포트의 정의를 명확히 해야 합니다.outputport는 프로세스 템플릿(Process)이 정의한 현재 노드의 흐름 출구를 가리킨다. 사실은 현재 노드에서 다음 노드로 출발하는 연결선의 줄수(forword or reject)가 상기 잘못된 로그를 추적하여 코드를 역컴파일하여 얻을 수 있다. outputport의 값은 dm_프로세스 템플릿에서 가져옵니다.현재 노드에서 같은 다음 노드까지 두 개의 선(성공과 실패)이 있기 때문에 가져온 output port의 값은 두 개(각각 Output:0과 Output:1)
    		IDfWorkitem workitemid = (IDfWorkitem)session.getObjectByQualification("dmi_workitem where r_object_id='"+sWorkItemId+"'");
    		IDfList forwardActList = workitemid.getForwardActivities();
    		if(workitemid.getRuntimeState() != IDfWorkitem.DF_WI_STATE_ACQUIRED) {
    			workitemid.acquire();
    		}
    		
    		IDfActivity actold = (IDfActivity)forwardActList.get(0);
    	    IDfList actList = new DfList();
    	    actList.append(actold);
    		//workitemid.setOutputByActivities(actList);
            IDfList outputPorts = new DfList();
            IDfId workflowId = session.getIdByQualification("dm_workflow where r_object_id='4d00000b8001f147'");
            IDfWorkflow wf = (IDfWorkflow)session.getObject(workflowId);
            IDfId procId = wf.getProcessId();
            System.out.println("Process id="+procId.toString());
            IDfProcess process = (IDfProcess)session.getObject(procId);
            int seqno = getActSeqno(workitemid);
            int seqnoIndex = wf.findInt("r_act_seqno", seqno);
            if(seqno >= 0)
            {
                String aliasName = wf.getActName(seqnoIndex);
                for(int j = 0; j < actList.getCount(); j++)
                {
                    IDfActivity act = (IDfActivity)actList.get(j);
                    IDfId actID = act.getObjectId();
                    IDfList actNames = new DfList();
                    int numActs = process.getActivityCount();
                    for(int i = 0; i < numActs; i++)
                        if(process.getActivityDefId(i).equals(actID))
                            actNames.appendString(process.getActivityName(i));
    
                    for(int i = 0; i < process.getProcessLinkCount(); i++)
                    {
                        if(process.getLinkSrcActivity(i).compareTo(aliasName) != 0)
                            continue;
                        System.out.println("process.getLinkSrcActivity(i)="+process.getLinkSrcActivity(i));
                        String destActName = process.getLinkDestActivity(i);
                        int destListIndex = actNames.findStringIndex(destActName);
                        if(destListIndex > -1)
                        {
                            String srcPort = process.getLinkSrcPort(i);
                            outputPorts.appendString(srcPort);
                        }
                    }
    
                }
    
            }
  • 이상에서 두 값이 같지 않다는 것을 알 수 있다.원인을 찾다.Porcess Builder를 통해 1의 값을 2로 수정합니다.(check out 이후 DQL을 사용하여 dm_activity를 업데이트할 수도 있음)
  • 이론적으로 수정된 후에 절차는 통과할 수 있을 것이다.그러나 잘못을 고친 뒤에도 똑같은 실수를 했다.다시 원인을 찾아 DQL을 사용하여 현재 dm_ 보기workflow 정보
    select * from dm_workflow where r_object_id='4dXXXXXXXXXXX'
    발견 dm_워크플로우에 프로세스 템플릿을 기록하는 id 번호 process_id를 다시 DQL로 검사해 보니 대응하는 프로세스 템플릿의 id
    select * from dm_process where object_name = 'XXXXXXXXX'
    가 다르다는 것을 알 수 있습니다.즉, Process Builder를 통해 프로세스 템플릿을 수정한 후 프로세스 템플릿이 출시되고 이에 대응하는 r_object_id 번호가 업데이트되었습니다.SQL을 사용하여 dm_를 업데이트할 수 없습니다.workflow의 process_id
    update dm_workflow object  set process_id='4bXXXXXXXXXX' where r_object_id='4dXXXXXXXXXXXXXX'
  • 시도해 보아도 안 된다.낡은 프로세스 템플릿이 기록된 다른 정보도 있을 것이다.추측해 봐, dmi_workitem에 있는 (dm_activity의 실례) SQL을 사용하는db조회(DQL은 충분한 정보를 볼 수 없음)
    Select * From Dmi_Workitem_R Where R_Object_Id='4aXXXXXXXX';
    Select * From Dmi_Workitem_S Where R_Object_Id='4aXXXXXXXX';
    Select * From Dmi_Workitem_Sp Where R_Object_Id='4aXXXXX';
    Select * From Dmi_Workitem_Rp Where R_Object_Id='4aXXXXXXX';
    아니나 다를까, R_Act_Def_Id 이 두 칸은 각각 오래된 dm_를 기록했습니다activity의 id. 마찬가지로 사용, DQL 변경.성공했어...
  • 남겨진 문제:
    		IDfList forwardActList = workitemid.getForwardActivities();
    		if(workitemid.getRuntimeState() != IDfWorkitem.DF_WI_STATE_ACQUIRED) {
    			workitemid.acquire();
    		}		
    		IDfActivity forwardAct = (IDfActivity)forwardActList.get(0);
    	    IDfList actList = new DfList();
    	    actList.append(forwardAct);
    	    workitemid.setOutputByActivities(actList);
                workitemid.complete();
    
  • 여기는 분명히 성공의 그 노선을 가리키고 있는데, 왜 실패한 그 노선을 찾으려고 합니까?

    좋은 웹페이지 즐겨찾기