example紹介- Event listener

f:id:wkzk:20090713022438j:image
というプロセスがありまして、jPDLソースで以下のように書きます

<process name="EventListener" xmlns="http://jbpm.org/4.0/jpdl">

  <on event="start">
    <event-listener class="org.jbpm.examples.eventlistener.LogListener">
      <field name="msg"><string value="start on process definition"/></field>
    </event-listener>
  </on>

  <start g="17,19,48,48">
    <transition to="wait"/>
  </start>

  <state name="wait" g="96,16,104,52">
      <on event="start">
        <event-listener class="org.jbpm.examples.eventlistener.LogListener">
          <field name="msg"><string value="start on activity wait"/></field>
        </event-listener>
      </on>
      <on event="end">
        <event-listener class="org.jbpm.examples.eventlistener.LogListener">
          <field name="msg"><string value="end on activity wait"/></field>
        </event-listener>
      </on>
      <transition to="park">
        <event-listener class="org.jbpm.examples.eventlistener.LogListener">
          <field name="msg"><string value="take transition"/></field>
        </event-listener>
      </transition>
  </state>
  
  <state name="park" g="231,19,80,52"/>

</process>

で、LogListenerの実装は以下の通り

public class LogListener implements EventListener {

  String msg;
  
  public void notify(EventListenerExecution execution) {
    List<String> logs = (List<String>) execution.getVariable("logs");
    if (logs==null) {
      logs = new ArrayList<String>();
      execution.setVariable("logs", logs);
    }
    
    logs.add(msg);
    
    execution.setVariable("logs", logs);
  }
}

jBPMAPIであるEventListenerを実装すればOK!これでフックして呼び出してくれます。