使用 spring 设置 drools 6 时出错 4-方法 processData(LicenseCredential) 未定义类型 Rule_Renewal_alert_for_60]
Getting error while setup drools 6 with spring 4-The method processData(LicenseCredential) is undefined for the type Rule_Renewal_alert_for_60]
我是 Drools 的新手。我使用 spring-4.1 和 drool-6.1.0.Final 设置了一个新项目。但是当我尝试 运行 项目时,出现以下错误
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'autoalert-ksession-stateless': Cannot resolve reference to bean 'autoalert-kbase' while setting bean property 'kBase'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'autoalert-kbase': Invocation of init method failed; nested exception is java.lang.RuntimeException: Error while creating KieBase[Message [id=1, level=ERROR, path=drools/rules/Rule.drl, line=27, column=0
text=[ function processDataprocessData (line:27): learnerCsvFileWriter cannot be resolved
]], Message [id=2, level=ERROR, path=drools/rules/Rule.drl, line=33, column=0
text=Rule Compilation error The import defaultpkg.ProcessData cannot be resolved
The method processData(LicenseCredential) is undefined for the type Rule_Renewal_alert_for_60_days2039807096], Message [id=3, level=ERROR, path=drools/rules/Rule.drl, line=-1, column=0
text=Error importing : 'defaultpkg.ProcessData.processData']]
这是我的 spring 和 drools 配置文件
流口水-context.xml
<kie:kmodule id="autoalert-module">
<kie:kbase name="autoalert-kbase" packages="drools.rules">
<kie:ksession name="autoalert-ksession-stateless" type="stateless" />
</kie:kbase>
</kie:kmodule>
<bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
applicationContext.xml
<context:annotation-config />
<context:property-placeholder location="classpath:autoalert.properties" ignore-unresolvable="true" />
<import resource="classpath:database/datasource-tx.xml" />
<import resource="classpath:drools/drools-context.xml" />
<bean id="csvFileWriter" class="com.softech.vu360.autoalert.CsvFileWriter" />
<bean id="businessRuleProcessor" class="com.softech.vu360.autoalert.rule.BusinessRuleProcessor">
<property name="statelessKieSession" ref="autoalert-ksession-stateless" />
<property name="csvFileWriter" ref="csvFileWriter" />
</bean>
这是我的规则文件。
import com.softech.vu360.autoalert.util.Utility;
import static com.softech.vu360.autoalert.util.Utility.getCurrentDate;
import static com.softech.vu360.autoalert.util.Utility.getDate;
import static com.softech.vu360.autoalert.util.Utility.getMonthNameFromInt;
import com.softech.vu360.autoalert.model.LicenseCredential;
import com.softech.vu360.autoalert.model.Learner;
import com.softech.vu360.autoalert.CsvFileWriter;
import com.softech.vu360.autoalert.mail.EmailRegistrationService;
import java.util.Date;
global com.softech.vu360.autoalert.CsvFileWriter learnerCsvFileWriter;
function void processData(LicenseCredential licenseCredential){
Learner learner = new Learner();
learner.setLearnerName(licenseCredential.getLearnerName());
learner.setLearnerEmailAddress(licenseCredential.getLearnerEmailAddress());
learner.setUserGUID(licenseCredential.getUserGUID());
...
learnerCsvFileWriter.add(learner);
}
rule "Renewal alert for 60 days"
when
licenseCredential : LicenseCredential()
(
eval(licenseCredential.getRenewalDeadlineDay() == "0" && licenseCredential.getRenewalDeadlineMonth() == "0") &&
eval(getCurrentDate().after(getDate(2, licenseCredential.getCourseCompletionDate().getDate(), licenseCredential.getCourseCompletionDate().getMonth()+1))) &&
eval(getCurrentDate().before(getDate(1, licenseCredential.getCourseCompletionDate().getDate(), licenseCredential.getCourseCompletionDate().getMonth()+1)))
) ||
(
eval(getCurrentDate().after(getDate(2, Integer.valueOf(licenseCredential.getRenewalDeadlineDay()), Integer.valueOf(licenseCredential.getRenewalDeadlineMonth()) ))) &&
eval(getCurrentDate().before(getDate(1, Integer.valueOf(licenseCredential.getRenewalDeadlineDay()), Integer.valueOf(licenseCredential.getRenewalDeadlineMonth() ))))
)
then
System.out.println("Rule For 60 Days Called");
processData(licenseCredential);
end
这是我的 POM 文件:
<properties>
<java-version>1.8</java-version>
<junit.version>4.12</junit.version>
<!-- Spring -->
<org.springframework.version>4.1.4.RELEASE</org.springframework.version>
<!-- Drools -->
<drools.version>6.1.0.Final</drools.version>
<drools-maven-plugin.version>6.0.0.CR5</drools-maven-plugin.version>
<maven-compiler-plugin.version>3.2</maven-compiler-plugin.version>
...
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
....
<!-- Drools -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-bpmn2</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Maven compiler plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
....
<plugin>
<groupId>org.drools</groupId>
<artifactId>drools-maven-plugin</artifactId>
<version>${drools-maven-plugin.version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
这是我的主文件
public static void main(String[] args){
final ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
LicenseCredentialDAO dao = (LicenseCredentialDAOImpl)context.getBean("licenseCredentialDAO");
List<LicenseCredential> objectList = dao.select();
BusinessRuleProcessor ruleProcessor = (BusinessRuleProcessor)context.getBean("businessRuleProcessor");
ruleProcessor.configureAndApplyRulesOnObject(objectList);
CsvFileWriter learnerCsvFileWriter = context.getBean("csvFileWriter", CsvFileWriter.class);
learnerCsvFileWriter.writeCsvFile("abc.csv");
}
这是我的 BusinessRuleProcessor class
public class BusinessRuleProcessor {
private StatelessKieSession statelessKieSession;
private CsvFileWriter csvFileWriter;
// getters and setters
public void configureAndApplyRulesOnObject(List<LicenseCredential> objectList){
statelessKieSession.setGlobal("learnerCsvFileWriter", csvFileWriter);
statelessKieSession.execute(objectList);
}
}
为什么我收到
的错误
function processDataprocessData (line:27): learnerCsvFileWriter cannot be resolved
Rule Compilation error The import defaultpkg.ProcessData cannot be resolved
The method processData(LicenseCredential) is undefined for the type Rule_Renewal_alert_for_60_days2039807096]
请帮忙。
谢谢
奇怪的是,函数 processDataprocessData 中指示错误,它不在您发布的 DRL 中,但还有另一个错误表明没有函数 processData,它出现在 DRL 中。你有没有伪造代码?
但问题很简单,您不能在函数中引用全局变量。要使用全局,请将其作为参数传递。
function void processData(LicenseCredential licenseCredential,
CsvFileWriter learnerCsvFileWriter ){
....
}
rule ...
then
System.out.println("Rule For 60 Days Called");
processData(licenseCredential, learnerCsvFileWriter);
end
请向 Drools 团队投诉!
我是 Drools 的新手。我使用 spring-4.1 和 drool-6.1.0.Final 设置了一个新项目。但是当我尝试 运行 项目时,出现以下错误
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'autoalert-ksession-stateless': Cannot resolve reference to bean 'autoalert-kbase' while setting bean property 'kBase'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'autoalert-kbase': Invocation of init method failed; nested exception is java.lang.RuntimeException: Error while creating KieBase[Message [id=1, level=ERROR, path=drools/rules/Rule.drl, line=27, column=0
text=[ function processDataprocessData (line:27): learnerCsvFileWriter cannot be resolved
]], Message [id=2, level=ERROR, path=drools/rules/Rule.drl, line=33, column=0
text=Rule Compilation error The import defaultpkg.ProcessData cannot be resolved
The method processData(LicenseCredential) is undefined for the type Rule_Renewal_alert_for_60_days2039807096], Message [id=3, level=ERROR, path=drools/rules/Rule.drl, line=-1, column=0
text=Error importing : 'defaultpkg.ProcessData.processData']]
这是我的 spring 和 drools 配置文件
流口水-context.xml
<kie:kmodule id="autoalert-module">
<kie:kbase name="autoalert-kbase" packages="drools.rules">
<kie:ksession name="autoalert-ksession-stateless" type="stateless" />
</kie:kbase>
</kie:kmodule>
<bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
applicationContext.xml
<context:annotation-config />
<context:property-placeholder location="classpath:autoalert.properties" ignore-unresolvable="true" />
<import resource="classpath:database/datasource-tx.xml" />
<import resource="classpath:drools/drools-context.xml" />
<bean id="csvFileWriter" class="com.softech.vu360.autoalert.CsvFileWriter" />
<bean id="businessRuleProcessor" class="com.softech.vu360.autoalert.rule.BusinessRuleProcessor">
<property name="statelessKieSession" ref="autoalert-ksession-stateless" />
<property name="csvFileWriter" ref="csvFileWriter" />
</bean>
这是我的规则文件。
import com.softech.vu360.autoalert.util.Utility;
import static com.softech.vu360.autoalert.util.Utility.getCurrentDate;
import static com.softech.vu360.autoalert.util.Utility.getDate;
import static com.softech.vu360.autoalert.util.Utility.getMonthNameFromInt;
import com.softech.vu360.autoalert.model.LicenseCredential;
import com.softech.vu360.autoalert.model.Learner;
import com.softech.vu360.autoalert.CsvFileWriter;
import com.softech.vu360.autoalert.mail.EmailRegistrationService;
import java.util.Date;
global com.softech.vu360.autoalert.CsvFileWriter learnerCsvFileWriter;
function void processData(LicenseCredential licenseCredential){
Learner learner = new Learner();
learner.setLearnerName(licenseCredential.getLearnerName());
learner.setLearnerEmailAddress(licenseCredential.getLearnerEmailAddress());
learner.setUserGUID(licenseCredential.getUserGUID());
...
learnerCsvFileWriter.add(learner);
}
rule "Renewal alert for 60 days"
when
licenseCredential : LicenseCredential()
(
eval(licenseCredential.getRenewalDeadlineDay() == "0" && licenseCredential.getRenewalDeadlineMonth() == "0") &&
eval(getCurrentDate().after(getDate(2, licenseCredential.getCourseCompletionDate().getDate(), licenseCredential.getCourseCompletionDate().getMonth()+1))) &&
eval(getCurrentDate().before(getDate(1, licenseCredential.getCourseCompletionDate().getDate(), licenseCredential.getCourseCompletionDate().getMonth()+1)))
) ||
(
eval(getCurrentDate().after(getDate(2, Integer.valueOf(licenseCredential.getRenewalDeadlineDay()), Integer.valueOf(licenseCredential.getRenewalDeadlineMonth()) ))) &&
eval(getCurrentDate().before(getDate(1, Integer.valueOf(licenseCredential.getRenewalDeadlineDay()), Integer.valueOf(licenseCredential.getRenewalDeadlineMonth() ))))
)
then
System.out.println("Rule For 60 Days Called");
processData(licenseCredential);
end
这是我的 POM 文件:
<properties>
<java-version>1.8</java-version>
<junit.version>4.12</junit.version>
<!-- Spring -->
<org.springframework.version>4.1.4.RELEASE</org.springframework.version>
<!-- Drools -->
<drools.version>6.1.0.Final</drools.version>
<drools-maven-plugin.version>6.0.0.CR5</drools-maven-plugin.version>
<maven-compiler-plugin.version>3.2</maven-compiler-plugin.version>
...
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
....
<!-- Drools -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-bpmn2</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Maven compiler plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
....
<plugin>
<groupId>org.drools</groupId>
<artifactId>drools-maven-plugin</artifactId>
<version>${drools-maven-plugin.version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
这是我的主文件
public static void main(String[] args){
final ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
LicenseCredentialDAO dao = (LicenseCredentialDAOImpl)context.getBean("licenseCredentialDAO");
List<LicenseCredential> objectList = dao.select();
BusinessRuleProcessor ruleProcessor = (BusinessRuleProcessor)context.getBean("businessRuleProcessor");
ruleProcessor.configureAndApplyRulesOnObject(objectList);
CsvFileWriter learnerCsvFileWriter = context.getBean("csvFileWriter", CsvFileWriter.class);
learnerCsvFileWriter.writeCsvFile("abc.csv");
}
这是我的 BusinessRuleProcessor class
public class BusinessRuleProcessor {
private StatelessKieSession statelessKieSession;
private CsvFileWriter csvFileWriter;
// getters and setters
public void configureAndApplyRulesOnObject(List<LicenseCredential> objectList){
statelessKieSession.setGlobal("learnerCsvFileWriter", csvFileWriter);
statelessKieSession.execute(objectList);
}
}
为什么我收到
的错误function processDataprocessData (line:27): learnerCsvFileWriter cannot be resolved
Rule Compilation error The import defaultpkg.ProcessData cannot be resolved
The method processData(LicenseCredential) is undefined for the type Rule_Renewal_alert_for_60_days2039807096]
请帮忙。
谢谢
奇怪的是,函数 processDataprocessData 中指示错误,它不在您发布的 DRL 中,但还有另一个错误表明没有函数 processData,它出现在 DRL 中。你有没有伪造代码?
但问题很简单,您不能在函数中引用全局变量。要使用全局,请将其作为参数传递。
function void processData(LicenseCredential licenseCredential,
CsvFileWriter learnerCsvFileWriter ){
....
}
rule ...
then
System.out.println("Rule For 60 Days Called");
processData(licenseCredential, learnerCsvFileWriter);
end
请向 Drools 团队投诉!