Ok.
That's my code:

/************************************** Payment Complete **************************************/
rule "Pay complete"
    salience 10
    no-loop true
when
    event : PaywayEvent(id == PaywayEventType.OPERATION_IN)
    paymentData : PaymentData(credit >= saleImport)   
    transaction : CurrentTransaction (state == TransactionState.CHARGE_PRODUCT)   
    eval (!paywayManager.isStopped())
then
    retract(event);
   
    updateDebt(languageManager, hmiManager,paymentData.getDebt());
    log.info("Machine.drl","Charge complete. Stopping devices!. Debt is "+paymentData.getDebt());
    for(Enumeration<String> e = paywayManager.getPaywayNames(); e.hasMoreElements(); ){
        String payway = e.nextElement();
        if(paywayManager.getPayway(payway).isLoaded()
            && !paywayManager.getPayway(payway).getPaywayApi().isStopped()) {
            PaywayEvent paywayEvent = new PaywayEvent(PaywayEventType.STOP_PAYMENT_DEVICES);
            paywayEvent.setDevice(payway);
            insert(paywayEvent);
        }
    }       
end


This is the stop rule of the device

/******************************************STOP PAYMENT DEVICES ****************************/
rule "Stop EmTicket Device"
    salience 10
    no-loop true
when
    event : PaywayEvent(id == PaywayEventType.STOP_PAYMENT_DEVICES && device == "discountticket")
    transaction : CurrentTransaction (state == TransactionState.CHARGE_PRODUCT)   
    eval (!emTicket.isStopped())
then
    retract(event);
    if (emTicket.stop()){
        electromechanical.disableTakeTicket();
        electromechanical.blinkingLedOff();
        emTicket.setState(EmTicketState.OUT_OF_SERVICE);
    }
    else{
        log.info("EmTicket","EmTicket cannot be stoped!");
    }
   
    insert (new PaywayEvent(PaywayEventType.OPERATION_IN));
end


So, there are bidirectional calls between STOP_PAYMENT_DEVICES and OPERATION_IN (because emTicket can't be stopped, so an event should be fired soon)

While this 2 rules are firing the other, the hardware sends an DISCOUNT_TICKET_ACCEPTED, that updates the debt, and the state of EmTicket, so the in next STOP_PAYMENT_DEVICES emTicket will be stopped.

rule "Discount Ticket discarded when accepted"
    salience 1000
    no-loop true
when
    event : ElectromechanicalEvent (eventType == ElectromechanicalEventType.CONSUM_EVENT
    && description == "articleDiscarded")
    transaction : CurrentTransaction(state == TransactionState.CHARGE_PRODUCT)
    eval (emTicket.getState() == EmTicketState.ARTICLE_TAKEN)
    paymentData : PaymentData()
then   
  lot of code here..
end


The problem I'm facing is that  rule "Discount Ticket discarded when accepted" is never fired (and has a lot more of salience than the other two)! The other two rules are in a constant bucle. The event of the discarded is sent via enginer.insertEvent() && fireAllRules. Maybe insert command in drl files has more priority than facts invoked from java classes?
 Thanks in advance!










2011/7/7 Wolfgang Laun <wolfgang.laun@gmail.com>
Sorry, but I become more confused with every re-read. I think the original code is required.

I think that this is nothing but a FSM. Generally, this sort of problem should be doable without resorting to salience (except for one or two low priority ones acting as the "safety net").

-W




On 7 July 2011 16:35, jmolly <jmolly@gmail.com> wrote:
Hello.
I'm facing some problems in drools with salience. (maybe I don't understand
how it works)

We have a rule that check if an import has been satisfied by the client. But
we have a lot of pay methods so, when the import has been satisfied, we have
to stop all the payment devices. If a payment device is in use, we can't
stop it, so we send stop commands until device can stop.
The problem is that if a device is making a pay process, and consumes an
event, that event is never fired.

Maybe I can explain better with code:


rule "Pay device stop"
Salience 10
Try to stop the device and sends an OPERATION_IN event if can't stop
(because there is a ticket inside)

Machine rule
rule "Operation in received witch devices not stopped"
salience 10
  Sent stop events to all devices

Machine rule
rule "Operation in received with devices stopped"
salience 10
   All ok. Finish operation


rule "Ticket data read"
salience 1000
 updates the debt for the user and sends an OPERATION_IN

The pay hardware, when is reading a ticket, sent a TICKET_DATA_READ
this rule has salience 100 and should be fired inmediatly but Drools is
entering all time in a bucle from Operation in received and Pay stop device.


Can someone give a clue about what are we doing wrong?


Sorry for the english. I can post the original code if needed.
Thanks in advance










--
View this message in context: http://drools.46999.n3.nabble.com/Problem-with-salience-tp3148382p3148382.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users


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