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(a)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(a)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...
> Sent from the Drools: User forum mailing list archive at
Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users