слюни всегда истинное правило стреляет только один раз - PullRequest
1 голос
/ 01 декабря 2019

У меня есть эти 2 правила:

rule "challenge 1" salience 10
    when
        ClientTransaction(amount < 30)
    then
        challenge.setChallenge("challenge1");
end

rule "challenge 2" salience 0
    when
        eval( true )
    then
        challenge.setChallenge("challenge2");
end

и этот код Java:


public class ComputeChallengeDroolsRulesImplementation implements IComputeChallenge {
    private KieServices kieServices = KieServices.Factory.get();
    private KieSession kieSession = getKieSession();
    private static final String RULES_PATH = "rules/";

    public KieFileSystem getKieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        String[] rules = new File(getClass().getClassLoader().getResource(RULES_PATH).getFile()).list();
        for (String rule : rules) {
            kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + rule));
        }
        return kieFileSystem;
    }

    public KieContainer getKieContainer() throws IOException {
        getKieRepository();

        KieBuilder kb = kieServices.newKieBuilder(getKieFileSystem());
        kb.buildAll();

        KieModule kieModule = kb.getKieModule();
        KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId());

        return kContainer;
    }

    public void getKieRepository() {
        final KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(
                new KieModule() {
                    public ReleaseId getReleaseId() {
                        return kieRepository.getDefaultReleaseId();
                    }
                });
    }

    @Bean
    public KieSession getKieSession() {
        try {
            return getKieContainer().newKieSession();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Challenge2 computeChallenge(ClientTransaction clientTransaction) {
        kieSession.insert(clientTransaction);
        Challenge2 challenge = new Challenge2();
        kieSession.setGlobal("challenge", challenge);
        kieSession.fireAllRules();
        return challenge;
    }

}

вот класс ClientTransation:


public class ClientTransaction {
  private String id;
  private String merchant;
  private double amount;

  public ClientTransaction() {
  }

  public ClientTransaction(String id, String merchant, double amount) {
    this.id = id;
    this.merchant = merchant;
    this.amount = amount;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getMerchant() {
    return merchant;
  }

  public void setMerchant(String merchant) {
    this.merchant = merchant;
  }

  public double getAmount() {
    return amount;
  }

  public void setAmount(double amount) {
    this.amount = amount;
  }
}

А воткласс Challenge2:


public class Challenge2 {
  private String challenge;

  public Challenge2() {
  }

  public Challenge2(String challenge) {
    this.challenge = challenge;
  }

  public String getChallenge() {
    return challenge;
  }

  public void setChallenge(String challenge) {
    this.challenge = challenge;
  }
}


, когда я вызываю ComputeChallengeDroolsRulesImplementation.computeChallenge с количеством <30 раз, он возвращает объект вызова со значением «challenge1» несколько раз, как и ожидалось. </p>

Но когда я вызываю ComputeChallengeDroolsRulesImplementation.computeChallenge с количеством> = 30 раз, первый раз он возвращает значение «challenge2», но каждый раз, когда он возвращает объект Challenge2 с нулевым значением?

Являюсь ли яделаете что-то не так?

Спасибо

...