Hi all, I still have problems with timer ... but now ... with multiple timers in diferent nodes, and when one finish, it creates the next node instance more then once!
I dont know what to do .... i know that when using timer, i need to save processinstance ... and it's what i'm doing ! see my process definition: <process-definition | name="controle-teste"> | <swimlane name="Supervisor-Cliente"> | <assignment class="br.com.glr.jbpm.handlers.SwimlaneAssignmentHandler" config-type="bean"> | <swimlaneName>Supervisor-Cliente</swimlaneName> | </assignment> | </swimlane> | <swimlane name="Supervisor-Celula"> | <assignment class="br.com.glr.jbpm.handlers.SwimlaneAssignmentHandler" config-type="bean"> | <swimlaneName>Supervisor-Celula</swimlaneName> | </assignment> | </swimlane> | <swimlane name="Diretor-Operacional"> | <assignment class="br.com.glr.jbpm.handlers.SwimlaneAssignmentHandler" config-type="bean"> | <swimlaneName>Diretor-Operacional</swimlaneName> | </assignment> | </swimlane> | <swimlane name="Gerente-Cliente"> | <assignment class="br.com.glr.jbpm.handlers.SwimlaneAssignmentHandler" config-type="bean"> | <swimlaneName>Gerente-Cliente</swimlaneName> | </assignment> | </swimlane> | <swimlane name="Operador-Celula"> | <assignment class="br.com.glr.jbpm.handlers.SwimlaneAssignmentHandler" config-type="bean"> | <swimlaneName>Operador-Celula</swimlaneName> | </assignment> | </swimlane> | <swimlane name="Diretor-Geral"> | <assignment class="br.com.glr.jbpm.handlers.SwimlaneAssignmentHandler" config-type="bean"> | <swimlaneName>Diretor-Geral</swimlaneName> | </assignment> | </swimlane> | <start-state name="inicio"> | <transition name="tr1" to="confirma-abertura"/> | </start-state> | <task-node name="confirma-abertura"> | <task name="abertura" description="Confirmar abertura de admissoes" swimlane="Supervisor-Cliente"/> | <event type="node-leave"> | <action name="notificar" class="br.com.glr.jbpm.handlers.MailToSwimlaneActionHandler" config-type="bean"> | <from>[EMAIL PROTECTED]</from> | <swimlaneNames>Supervisor-Celula;Diretor-Operacional;Diretor-Geral;Gerente-Cliente;Operador-Celula</swimlaneNames> | <subject>Confirmada a abertura de admissoes</subject> | <message/> | </action> | </event> | <transition name="confirmar" to="aguarda"/> | </task-node> | <state name="aguarda"> | <timer duedate="1 minute" name="wait" transition="confirmar"/> | <transition name="confirmar" to="confirma-fechamento"/> | </state> | <task-node name="confirma-fechamento"> | <timer duedate="2 minutes" name="fechamento-timer" transition="nao" /> | <event type="node-enter"> | <script> | <variable name="count" access="read,write"/> | <expression>count=0;</expression> | </script> | </event> | <task name="fechamento" description="Confirmar fechamento de admissoes" swimlane="Supervisor-Cliente"> | <event type="task-end"> | <action name="notificar" class="br.com.glr.jbpm.handlers.MailToSwimlaneActionHandler" config-type="bean"> | <from>[EMAIL PROTECTED]</from> | <swimlaneNames>Supervisor-Celula;Diretor-Operacional;Diretor-Geral;Gerente-Cliente;Operador-Celula</swimlaneNames> | <subject>Confirmado o fechamento de admissoes</subject> | <message/> | </action> | </event> | </task> | <transition name="sim" to="termino"/> | <transition name="nao" to="decide"/> | </task-node> | <decision name="decide"> | <event type="node-enter" > | <script> | <variable name="count" access="read,write"/> | <expression>count++;</expression> | </script> | </event> | <transition name="nivel-0" to="Cobranca-Diretor-Geral"> | <condition>count > 10</condition> | </transition> | <transition name="nivel-1" to="Cobranca-Diretor-Geral"> | <condition>count > 8</condition> | </transition> | <transition name="nivel-2" to="Cobranca-Diretor-Geral"> | <condition>count > 3</condition> | </transition> | <transition name="nivel-3" to="Cobranca-Diretor-Geral"> | <condition>count > 0</condition> | </transition> | </decision> | <task-node name="Cobranca-Diretor-Geral" > | <task name="Cobranca-Diretor-Geral" description="Cobranca de fechamento" swimlane="Diretor-Geral"> | <event type="task-create" > | <action name="notificar" class="br.com.glr.jbpm.handlers.MailToSwimlaneActionHandler" config-type="bean"> | <from>[EMAIL PROTECTED]</from> | <subject>Cobrar o fechamento de admissoes</subject> | <message/> | </action> | </event> | </task> | <transition name="cobrado" to="confirma-fechamento"/> | </task-node> | <end-state name="termino"></end-state> | </process-definition> see my thread execute code: public long executeTimer() throws IntegrationException { | long millisTillNextTimerIsDue = -1; | boolean isDueDateInPast = true; | | JbpmSession session = getJbpmSessionFactory().openJbpmSession(); | | try { | SchedulerSession schedulerSession = session.getSchedulerSession(); | | logger.debug("checking for timers"); | Iterator iter = schedulerSession.findTimersByDueDate(); | while ((iter.hasNext()) && (isDueDateInPast)) { | Timer timer = (Timer) iter.next(); | logger.debug("found timer " + timer); | | // if this timer is due | if (timer.isDue()) { | //session.getGraphSession().lockProcessInstance( timer.getToken().getProcessInstance() ); | logger.debug("executing timer '" + timer + "'"); | | // execute | timer.execute(); | | // if there was an exception, just save the timer | if (timer.getException() != null) { | //schedulerSession.saveTimer(timer); | session.getGraphSession().saveProcessInstance( timer.getToken().getProcessInstance() ); | | // if repeat is specified | } else if (timer.getRepeat() != null) { | // update timer by adding the repeat duration | Date dueDate = timer.getDueDate(); | | // suppose that it took the timer runner thread a | // very long time to execute the timers. | // then the repeat action dueDate could already have passed. | while (dueDate.getTime() <= System.currentTimeMillis()) { | dueDate = businessCalendar.add(dueDate, new Duration(timer.getRepeat())); | } | timer.setDueDate(dueDate); | // save the updated timer in the database | logger.debug("saving updated timer for repetition '" + timer + "' in '" + (dueDate.getTime() - System.currentTimeMillis()) + "' millis"); | //schedulerSession.saveTimer(timer); | session.getGraphSession().saveProcessInstance( timer.getToken().getProcessInstance() ); | | } else { | // delete this timer | logger.debug("deleting timer '" + timer + "'"); | //schedulerSession.deleteTimer(timer); | session.getGraphSession().saveProcessInstance( timer.getToken().getProcessInstance() ); | } | | } else { // this is the first timer that is not yet due | isDueDateInPast = false; | millisTillNextTimerIsDue = timer.getDueDate().getTime() - System.currentTimeMillis(); | } | } | | } finally { | //jbpmSession.commitTransactionAndClose(); | } | | return millisTillNextTimerIsDue; | | } | Please, any suggestions will be very appreciated !!! thanks View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3914560#3914560 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3914560 ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ JBoss-user mailing list JBoss-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jboss-user