[rules-users] Problem with salience
Aitor González Serrano
jmolly at gmail.com
Thu Jul 7 12:32:33 EDT 2011
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 at 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 at 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 at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110707/127eac9a/attachment.html
More information about the rules-users
mailing list