Activtivitiフローモニタリングフローチャート
7206 ワード
Activityは軽量級のプロセスエンジンとして、日常の仕事のニーズを基本的に満たしています.しかし、プロセスモニタリングに関わると、余裕があり、力が足りないように見えます.他のプラグインを借りずに、フローの追跡を実現するために下位コードの書き換えをできるだけ避けるにはどうすればいいのでしょうか.設計構想:
(1)1ページ、2つのtabラベル:AとB.
(2)Aラベルロードフローチャート、Bラベルロードフローデータ.
(3)フローチャートのロード:
重要なコード:
/履歴プロセスインスタンスを取得する、履歴インスタンスと実行中のプロセスインスタンスを取得する/HistoricProcessInstance hpi=workFlowEngineServiceImpl.findHistoryProcessInstanceByBusKey(businessKey); try{if(hpi==null){throw new RuntimeException("フローチャート異常を取得!");else { InputStream imageStream = workFlowEngineServiceImpl.getFlowMap(hpi, hpi.getId(), flowType); ServletOutputStream os = response.getOutputStream(); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = imageStream.read(buffer, 0, 1024)) != -1) { os.write(buffer, 0, bytesRead); } os.flush(); os.close(); imageStream.close(); } } catch(Exception){logger.error(e,e);throw new RuntimeException(「フローチャート異常取得!」
/findHistoryProcessInstanceByBusKeyメソッド/***プロセスビジネスキーに従って履歴プロセスインスタンスを問い合わせる*@param processId*@return*/p u b l i c H o s t r i c P r i c P r i c P r y ProcessInstanceByBusKey(String businessKey){HistoryService historyService=this.getHistoryService();return historyService.createHistorricProcessInstanceQuery(); .processInstanceBusinessKey(businessKey).singleResult(); }
/getFlowMapメソッド/public InputStream getFlowMap(H istoricProcessInstance processInstance,String instanceId,String flowType){
}
/getHighLightedFlowsメソッド/public List getHighLightedFlows(P r o s s s s e D i n t i o n Entity processDefinitionEntity,List historicActivity Instances){
}注意:
1)フローチャートでは${currName}のような変数を処理する必要がある場合があります.コードにはすでに書かれていますが、これらの変数を実際のデータに置き換える前提は、Variablesが記録されるため、処理されていない部分はこれらの変数を空の文字列に置き換える必要があります.これはいくつかの詳細処理です.
2)HistoricProcessInstance履歴データを取得するには、履歴データの記録レベルを設定する必要があるとともに、構成においてもフローチャート内の文字の文字の文字化けしを処理することができる.
(1)1ページ、2つのtabラベル:AとB.
(2)Aラベルロードフローチャート、Bラベルロードフローデータ.
: , 。
: , , 。
(3)フローチャートのロード:
businessKey, 。 :HistoricProcessInstance ProcessInstance, ?
HistoricProcessInstance: ( ), 。( getHistoricService() )
ProcessInstance : 。( getRuntimeService() )
: ProcessInstance, , HistoricProcessInstance 。
重要なコード:
/履歴プロセスインスタンスを取得する、履歴インスタンスと実行中のプロセスインスタンスを取得する/HistoricProcessInstance hpi=workFlowEngineServiceImpl.findHistoryProcessInstanceByBusKey(businessKey); try{if(hpi==null){throw new RuntimeException("フローチャート異常を取得!");else { InputStream imageStream = workFlowEngineServiceImpl.getFlowMap(hpi, hpi.getId(), flowType); ServletOutputStream os = response.getOutputStream(); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = imageStream.read(buffer, 0, 1024)) != -1) { os.write(buffer, 0, bytesRead); } os.flush(); os.close(); imageStream.close(); } } catch(Exception){logger.error(e,e);throw new RuntimeException(「フローチャート異常取得!」
/findHistoryProcessInstanceByBusKeyメソッド/***プロセスビジネスキーに従って履歴プロセスインスタンスを問い合わせる*@param processId*@return*/p u b l i c H o s t r i c P r i c P r i c P r y ProcessInstanceByBusKey(String businessKey){HistoryService historyService=this.getHistoryService();return historyService.createHistorricProcessInstanceQuery(); .processInstanceBusinessKey(businessKey).singleResult(); }
/getFlowMapメソッド/public InputStream getFlowMap(H istoricProcessInstance processInstance,String instanceId,String flowType){
processEngine = getInstance();
// RuntimeService runtimeService = processEngine.getRuntimeService();
// DynamicBpmnService flowMoniService = processEngine.getDynamicBpmnService();
/* */
RepositoryService repositoryService = processEngine.getRepositoryService();
/* */
HistoryService historyService = processEngine.getHistoryService();
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity)repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId());
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
/* , , */
List activityList = processDefinition.getActivities();
for(ActivityImpl activity : activityList){
String name = bpmnModel.getFlowElement(activity.getId()).getName();
bpmnModel.getFlowElement(activity.getId())
.setName(name.replaceAll("[\\w{}$\\-+]", ""));
}
/* , , */
List hisList = findProcessHistoryByPiid(instanceId);
for(ArkHistoricActivity hisActivity : hisList){
bpmnModel.getFlowElement(hisActivity.getActivityId())
.setName(hisActivity.getActivityName());
}
List activityInstances = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId).orderByHistoricActivityInstanceStartTime().asc().list();
List activitiIds = new ArrayList();
List flowIds = new ArrayList();
/* */
flowIds = flowServiceImpl.getHighLightedFlows(processDefinition, activityInstances);
/* */
for (HistoricActivityInstance hai : activityInstances) {
activitiIds.add(hai.getActivityId());
}
Context.setProcessEngineConfiguration(
(ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration());
/**
* ,
* processEngine.getProcessEngineConfiguration().getActivityFontName(),
* processEngine.getProcessEngineConfiguration().getLabelFontName(),
*/
InputStream imageStream = new DefaultProcessDiagramGenerator().generateDiagram(bpmnModel, "png", activitiIds,
flowIds, processEngine.getProcessEngineConfiguration().getActivityFontName(),
processEngine.getProcessEngineConfiguration().getLabelFontName(),
"", null, 1.0);
return imageStream;
}
/getHighLightedFlowsメソッド/public List getHighLightedFlows(P r o s s s s e D i n t i o n Entity processDefinitionEntity,List historicActivity Instances){
/* flowId*/
List highFlows = new ArrayList();
/* */
for (int i = 0; i < historicActivityInstances.size() - 1; i++) {
/* */
ActivityImpl activityImpl = processDefinitionEntity.findActivity(historicActivityInstances.get(i).getActivityId());
/* */
List sameStartTimeNodes = new ArrayList();
/* */
ActivityImpl sameActivityImpl1 = processDefinitionEntity.findActivity(historicActivityInstances.get(i + 1).getActivityId());
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
/* */
HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);
/* */
HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);
/* */
if (activityImpl1.getStartTime().equals(activityImpl2.getStartTime())) {
ActivityImpl sameActivityImpl2 = processDefinitionEntity.findActivity(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
}
/* */
else {
break;
}
}
/* */
List pvmTransitions = activityImpl.getOutgoingTransitions();
/* */
for (PvmTransition pvmTransition : pvmTransitions) {
/* , id, */
ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition.getDestination();
if (sameStartTimeNodes.contains(pvmActivityImpl)) {
highFlows.add(pvmTransition.getId());
}
}
}
return highFlows;
}注意:
1)フローチャートでは${currName}のような変数を処理する必要がある場合があります.コードにはすでに書かれていますが、これらの変数を実際のデータに置き換える前提は、Variablesが記録されるため、処理されていない部分はこれらの変数を空の文字列に置き換える必要があります.これはいくつかの詳細処理です.
2)HistoricProcessInstance履歴データを取得するには、履歴データの記録レベルを設定する必要があるとともに、構成においてもフローチャート内の文字の文字の文字化けしを処理することができる.