Uwiki
- 프로세스 시작 당시에 한번 돌리고픈 필터를 만들때
- Bad: instance.isNew()로 필터링 되어있어 프로세스가 시작될 때 한번만 호출될 것 같지만 프로세스의 시작과 함께 내재된 모든 ComplexActivity들과 시작과 동시에 실행되는 하위 액티비티들에 의하여 여러번 호출되는 결과 발생 (line 2 주목)
public void afterExecute(Activity activity, ProcessInstance instance) throws Exception {
if(instance.isNew()){
ProcessTransactionContext ptc = instance.getProcessTransactionContext();
HttpServletRequest req = (HttpServletRequest)ptc.getProcessManager().getGenericContext().get("request");
String strategyId = (String)req.getParameter("strategyId");
if(UEngineUtil.isNotEmpty(strategyId)){
((EJBProcessInstance) instance).getProcessInstanceDAO().set("strategyId", strategyId);
}
IDAO strategyDAO = instance.getProcessTransactionContext().findSynchronizedDAO("bpm_strtg", "strtgId", strategyId, IDAO.class);
int instanceCnt = strategyDAO.getInt("instCnt");
strategyDAO.set("instCnt", instanceCnt + 1); // increase instance count
}
- Good : 프로세스에 딱 한번만 호출되게끔 제대로 처리된 코드 (line 2 주목)
public void afterExecute(Activity activity, ProcessInstance instance) throws Exception {
if(instance.isNew() && activity instanceof ProcessDefinition){
ProcessTransactionContext ptc = instance.getProcessTransactionContext();
HttpServletRequest req = (HttpServletRequest)ptc.getProcessManager().getGenericContext().get("request");
String strategyId = (String)req.getParameter("strategyId");
if(UEngineUtil.isNotEmpty(strategyId)){
((EJBProcessInstance) instance).getProcessInstanceDAO().set("strategyId", strategyId);
}
IDAO strategyDAO = instance.getProcessTransactionContext().findSynchronizedDAO("bpm_strtg", "strtgId", strategyId, IDAO.class);
int instanceCnt = strategyDAO.getInt("instCnt");
strategyDAO.set("instCnt", instanceCnt + 1); // increase instance count
}