すべてのルールを起動して終了します。私の例では2つのルールしか持っていませんが、それらは相互に関係しています。つまり、ルール2はルール1の後に起動する必要があります。 問題は、ルール1の出力を印刷するだけです。内部的に同じメッセージ(Client is interested in skiing
)を出してください。Drools:ルール2は起動せず、ルール1は内部で起動します(ループに入ります)
package com.sample;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
/**
* This is a sample class to launch a rule.
*/
public class TestSimpleRules {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Client client = new Client();
Season season = new Season();
client.addProduct("snowboard");
client.addProduct("ski poles");
season.setSeason("winter");
kSession.insert(client);
kSession.insert(season);
kSession.fireAllRules();
} catch (Throwable t) {
t.printStackTrace();
}
}
public static class Client {
private Set<String> buyingHistory;
private String interestedIn;
public Client()
{
buyingHistory = new HashSet<String>();
}
public Set<String> getBuyingHistory() {
return this.buyingHistory;
}
public void addProduct(String product) {
this.buyingHistory.add(product);
}
public String getInterestedIn() {
return this.interestedIn;
}
public void setInterestedIn(String interestedI) {
this.interestedIn = interestedIn;
}
}
public static class Season {
private String currentSeason;
public String getSeason() {
return this.currentSeason;
}
public void setSeason(String season) {
this.currentSeason = season;
}
}
}
ルール:最初の
package com.javacodegeeks.drools;
import com.sample.TestSimpleRules.Client;
import com.sample.TestSimpleRules.Season;
rule "Rule #1"
when
c : Client(Client.getBuyingHistory() contains "snowboard", thisBuyingHistory : buyingHistory) and
s: Season(Season.getSeason() == "winter")
then
System.out.println(thisBuyingHistory);
c.setInterestedIn("skiing");
System.out.println("Client is interested in skiing");
update(c);
end
rule "Rule #2"
when
c: Client(Client.getInterestedIn() == "skiing" && !(Client.getBuyingHistory() contains "ski jacket"), thisBuyingHistory : buyingHistory)
then
System.out.println("Ski jacket is recommended");
end