Hi again,
I am calling an action and in this action i am fire a Rule from JRules. Based 
on the result of this rule i want to use a transition ( token.signal( "xxx" ) ).
But when i do this, i get an Exception. Is it not possible to use use 
token.signal in an action? And then, how should i realise actions in which i 
want to move to a next token? Is it only Possible with DecicionHandlers?

The Exception:
anonymous wrote : 
  | org.jbpm.JbpmException: can't continue execution on locked tokens.  
signalling the same token that executes an action is not allowed
  |     at org.jbpm.graph.exe.Token.signal(Token.java:164)
  |     at org.jbpm.graph.exe.Token.signal(Token.java:137)
  | 


  |   </decision>
  |    <decision name="SGA">
  |       <event type="node-enter">
  |                     <action name="checkSGA" 
class="actions.DefaultRuleAction">
  |                             <ruleFile>etr2.drl</ruleFile>
  |                             <transitionName>t_sga a</transitionName>
  |                             <transitionName_False>t_sga 
c</transitionName_False>
  |                     </action>
  |       </event>
  |       <transition name="t_sga a" to="SGA A"></transition>
  |       <transition name="t_sga b" to="SGA B"></transition>
  |       <transition name="t_sga c" to="SGA C"></transition>
  |    </decision>
  |    <state name="SGA A">
  | 

Action:

  | public class DefaultRuleAction extends RuleAction {
  |     private static final long serialVersionUID = 8459834862286126414L;
  |     
  |     //Name der Variablen die in der Action beruecksichtigt werden.
  |     public List objectNames = null;
  |     public String transitionName = null;
  |     public String transitionName_False = null;
  |     
  |     public void execute( ExecutionContext executionContext) throws 
Exception {              
  |             // TODO Auto-generated method stub
  |             System.err.println("My Timer-Rule-Action!");
  |             
  |             if (this.ruleFile == null) {
  |                     System.err.println("Es wurde kein Rule-File 
angegeben.");
  |                     // TODO String aus einer Property laden.
  |                     return;
  |             }
  |             
  |             // load up the RuleBase
  |             WorkingMemory workingMemory = null;
  |             try {
  |                     RuleBase ruleBase = readRule(this.ruleFile);
  |                     
  |                     workingMemory = this.generateWorkingMemory( ruleBase );
  |                     
  |                     this.assertObjectsIn( workingMemory, executionContext );
  |                     workingMemory.fireAllRules();
  | 
  |                     if( RuleAction.getResultFrom( workingMemory ) == true ){
  |                             if(this.transitionName != null){
  |                                     executionContext.getToken().signal( 
transitionName );
  |                             }
  |                     }else{
  |                             if(this.transitionName_False != null){
  |                                     executionContext.getToken().signal( 
transitionName_False );
  |                             }
  |                     }
  |                             
  |             } catch (FileNotFoundException fnfe) {
  |                     System.err.println("Es wurde ein falsches Rule-File 
angegeben.");
  |                     fnfe.printStackTrace();
  | //                   TODO String aus einer Property laden.
  |             } catch (MissingRuleResultException mrre){
  |                     System.err.println("Es wurde kein RuleResult-Object im 
WorkingMemory der Regel gefunden.");
  |                     mrre.printStackTrace();
  | //                  TODO String aus einer Property laden.
  |             } catch (Exception e){
  |                     System.err.println("Rule-Base konnte nicht angelegt 
werden.");
  |                     e.printStackTrace();
  | //                  TODO String aus einer Property laden.
  |             } finally{
  |                     if(workingMemory != null)
  |                             workingMemory.dispose();
  |             }
  |             
  |             //ArcaViaController.getInstance().cancelTimer( 
executionContext.getTimer() );
  |             
  |     }
  | 
  | 


  | public abstract class RuleAction implements ActionHandler{
  |     /* Name der Variablen des Workflows welche in das WorkingMemory
  |        der Regel eingepflegt werden sollen.*/
  |     protected List objectNames = null;
  |     
  |     protected String ruleFile = null;
  |     private RuleResult ruleResult = new RuleResult();
  |     
  |     /**
  |      * Please note that this is the "low level" rule assembly API.
  |      * @throws Exception 
  |      */
  |     protected static RuleBase readRule(String ruleFileLocation) throws 
Exception{
  | //          ruleFileLocation = "src" +
  | //                  System.getProperty("file.separator") +
  | //                  "rules" +
  | //                  System.getProperty("file.separator") +
  | //                  ruleFileLocation;
  |             
  |             System.err.println( ruleFileLocation );
  |             
  |             //read in the source
  |             Reader source = null;
  |             try{
  |                     source = new InputStreamReader( 
RuleAction.class.getResourceAsStream( "/"+ruleFileLocation ) );
  | //                  source = new InputStreamReader( new FileInputStream( 
new File(ruleFileLocation) ) );
  |                     
  |             }catch( Exception e ){
  |                     throw new FileNotFoundException();
  |             }
  |             
  |             //optionally read in the DSL (if you are using it).
  |             //Reader dsl = new InputStreamReader( 
DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
  | 
  |             //Use package builder to build up a rule package.
  |             //An alternative lower level class called "DrlParser" can also 
be used...
  |             
  |             DrlParser parser = new DrlParser();
  |             PackageDescr packageDescr = parser.parse( source);
  |             
  |             /*
  |              * Wenn der default PackageBuilder eine Exception erzeugt (was 
er tat),
  |              * soll man ihn dann durch diese Code-Zeilen ersetzen laut der 
JBoss wiki Seite
  |              */
  |             PackageBuilderConfiguration pkgBuilderCfg = new 
PackageBuilderConfiguration();
  |             pkgBuilderCfg.setCompiler(PackageBuilderConfiguration.JANINO);
  |             PackageBuilder builder = new PackageBuilder(pkgBuilderCfg);
  | 
  |                             
  |             //default PackageBuilder
  |             //PackageBuilder builder = new PackageBuilder();
  | 
  |             //this wil parse and compile in one step
  |             //NOTE: There are 2 methods here, the one argument one is for 
normal DRL.
  |             //builder.addPackageFromDrl( source );
  |             builder.addPackage(packageDescr);
  |             
  |             //Use the following instead of above if you are using a DSL:
  |             //builder.addPackageFromDrl( source, dsl );
  |             
  |             //get the compiled package (which is serializable)
  |             Package pkg = builder.getPackage();
  |             
  |             //add the package to a rulebase (deploy the rule package).
  |             RuleBase ruleBase = RuleBaseFactory.newRuleBase();
  |             ruleBase.addPackage( pkg );
  |             return ruleBase;
  |     }
  |     
  |     /**
  |      * Lädt aus dem uebergebenen WorkingMemory ein RuleResult-Object und
  |      * liefert den Result-Wert von diesem Object zurueck.
  |      * Dieser Result-Wert kann in einer Regel dazu verwendet werden,
  |      * ein Ergebniss zurueck zu liefern (zur Zeit nur true oder false).
  |      *   
  |      * @param wm WorkingMemory aus welchem das RuleResult-Object geprueft 
werden soll.
  |      * @return Den Result-Wert des RuleResult-Objectes in dem uebergeben 
WorkingMemory.
  |      * @throws MissingRuleResultException Es gibt kein RuleResult-Object im 
uebergebenen WorkingMemory.
  |      */
  |     protected static boolean getResultFrom( WorkingMemory wm ) throws 
MissingRuleResultException{
  | //          if( wm == null )
  | //                  throw new NullPointerException();
  |             
  |             List ruleResults = wm.getObjects( RuleResult.class );
  |             
  |             if( ruleResults.size() < 1 )
  |                     throw new MissingRuleResultException();
  |             
  |             RuleResult rs = (RuleResult)ruleResults.get(0);
  |             return rs.getResult();
  |             
  |     }
  |     
  |     /**
  |      * Lädt das RuleResult Object in den WorkingMemory
  |      * so das man Ihn später in der Rule verwenden kann und
  |      * das in Ihm stehende Ergebniss der Regel mit der Methode
  |      * <code>getResultFrom(WorkingMemory wm)</code> auslesen kann.
  |      * 
  |      * @param wm WorkingMemory welches mit einem RuleResult Object 
vorbereitet werden soll.
  |      */
  |     protected void prepareWorkingMemory( WorkingMemory wm ){
  | //          if( wm == null )
  | //                  throw new NullPointerException();
  |             wm.assertObject( this.ruleResult );
  |     }
  |     
  |     /**
  |      * Erzeugt einen neuen WorkingMemory in der uebergebenen RuleBase und
  |      * ruft fuer diesen dann <code>prepareWorkingMemory( WorkingMemory wm 
)</code>
  |      * auf um den WorkingMemory mit dem RuleResult-Object zu beladen.
  |      * 
  |      * @param ruleBase RuleBase in welchem das neue WorkingMemory erzeugt 
werden soll.
  |      * @return Das Erzeugte WorkingMemory.
  |      */
  |     protected WorkingMemory generateWorkingMemory( RuleBase ruleBase){
  |             WorkingMemory wm = ruleBase.newWorkingMemory();
  |             this.prepareWorkingMemory( wm );
  |             
  |             return wm;
  |     }
  |     
  |     /**
  |      * Lädt die Variablen des Workflows welche der Action bei Ihrem Aufruf
  |      * durch den Workflow uebergeben wurden in den WorkingMemory der Regel.
  |      *  
  |      * @param wm WorkingMemory welcher mit den Objecten beladen werden soll.
  |      * @param executionContext Context mittels welcher die Variablen 
enthaelt.
  |      */
  |     protected void assertObjectsIn( WorkingMemory wm, ExecutionContext 
executionContext ){
  | 
  |             if (objectNames != null) {
  |                     // Ausgewählte Variablen einladen
  |                     ContextInstance ci = 
executionContext.getContextInstance();
  |                     Iterator it = objectNames.iterator();
  |                     while (it.hasNext()) {
  |                             String objectName = (String) it.next();
  |                             wm.assertObject(ci.getVariable(objectName));
  |                     }
  |             }/*
  |                      * Zu gefährlich in der Handhabung daher deaktiviert 
else{ //
  |                      * Alle Variablen einladen wenn keine uebergeben wurden
  |                      * ContextInstance ci = 
executionContext.getContextInstance();
  |                      * Iterator it = 
ci.getVariables().entrySet().iterator();
  |                      * while(it.hasNext()){ workingMemory.assertObject( 
it.next() ); } }
  |                      */
  |             
  |     }
  | 
  | }
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3989613#3989613

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3989613

_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to