iMatrix平臺流程引擎事件處理之業務補償分析
0
前面已經介紹了表單字段權限的原理,下面再看看iMatrix平臺是怎樣處理事件的?

流程屬性中的業務補償:

自己認為業務補償也是屬于事件的。
1 xml中的配置
<process … … ……>
… … … …
<extend>
… … … …
<expiation-setting>
<set-type>http</set-type>
<delete-instance>
/expense-report/delete-instance-expiation.htm
</delete-instance>
<cancel-instance>
/expense-report/cancel-instance-expiation.htm
</cancel-instance>
<task-jump>/expense-report/task-jump-expiation.htm</task-jump>
<pause-instance/>
<continue-instance/>
<goback-task/>
</expiation-setting>
</extend>
… … … …
</process>
任務退回配置的是spring bean名稱,該bean需要實現的接口為com.norteksoft.wf.engine.client.ReturnTaskInterface。當在流程監控中刪除、取消、暫停、繼續實例時,做法基本一致,如下:
首先獲得xml中配置的請求方式和請求的url;當請求方式是HTTP方式時,使用httpclient請求url;當請求方式是RESTful方式時,使用的是Jersey的Client請求的。
WebUtil.java中的兩種請求方式實現如下:
/**
* 普通的http請求
* @param url
*/
public static void getHttpConnection(String url,Long companyId,LongentityId,String systemCode){
String resultUrl=SystemUrls.getBusinessPath(systemCode);
if(PropUtils.isBasicSystem(resultUrl)){
resultUrl = SystemUrls.getSystemUrl("imatrix");
}
log.info(" == systemurl : ["+resultUrl+"] == ");
resultUrl = resultUrl + url+"?companyId="+companyId+"&entityId="+entityId;
log.info(" == restleturl : ["+resultUrl+"] == ");
HttpGet httpget = new HttpGet(resultUrl);
HttpClient httpclient = new DefaultHttpClient();
ResponseHandler<String> responseHandler = newBasicResponseHandler();
try {
httpclient.execute(httpget, responseHandler);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
}
/**
* RESTful請求
* @param url
* @param companyId
*/
public static void restful(String url,Long companyId,Long entityId,StringsystemCode){
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
String resultUrl = SystemUrls.getSystemUrl(systemCode);
if(PropUtils.isBasicSystem(resultUrl)){
resultUrl = SystemUrls.getSystemUrl("imatrix");
}
log.info(" == systemurl : ["+resultUrl+"] == ");
resultUrl = resultUrl + url;
log.info(" == restleturl : ["+resultUrl+"] == ");
WebResource service = client.resource(resultUrl);
ClientResponse cr = service
.entity("companyId="+companyId+"&entityId="+entityId, MEDIA_TYPE)
.accept(MEDIA_TYPE)
.post(ClientResponse.class);
if(cr != null) log.info("=========== RESTful execute result : ["+cr.getEntity(String.class)+"]=========== ");
}