Good & Bads

Uwiki

  1. 프로세스 시작 당시에 한번 돌리고픈 필터를 만들때
  • 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
			
		}