- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 Spring Boot 1.2.2.RELEASE 运行 drools 6.2.0.Final。我按照文档中的说明配置了 drools。我的 kie-context.xml 配置文件是我保存 drools bean 的地方,看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:kie="http://drools.org/schema/kie-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://drools.org/schema/kie-spring http://drools.org/schema/kie-spring.xsd">
<kie:kmodule id="sample_module">
<kie:kbase name="kbase1" packages="composition-rules">
<kie:ksession name="ksession1" type="stateless"/>
</kie:kbase>
</kie:kmodule>
<bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
当我尝试编译应用程序并使用 spring-boot 运行时,出现以下错误:
java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6ab6cc3b: startup date [Wed Apr 15 13:57:02 CEST 2015]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:357)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:877)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.doClose(EmbeddedWebApplicationContext.java:150)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:342)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at skeleton.StorfinoApplication.main(StorfinoApplication.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
at java.lang.Thread.run(Thread.java:745)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Unable to get all ZipFile entries: /home/lukasz/dev/skeleton/application/target/application-1.0-SNAPSHOT.jar!
at org.drools.core.util.IoUtils.indexZipFile(IoUtils.java:133)
at org.drools.compiler.kie.builder.impl.ZipKieModule.<init>(ZipKieModule.java:20)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.createInternalKieModule(ClasspathKieProject.java:186)
at org.kie.spring.KModuleBeanFactoryPostProcessor.createKieModule(KModuleBeanFactoryPostProcessor.java:189)
at org.kie.spring.KModuleBeanFactoryPostProcessor.addKieModuleToRepo(KModuleBeanFactoryPostProcessor.java:162)
at org.kie.spring.KModuleBeanFactoryPostProcessor.postProcessBeanFactory(KModuleBeanFactoryPostProcessor.java:121)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:265)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:177)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at skeleton.StorfinoApplication.main(StorfinoApplication.java:23)
... 6 more
Caused by: java.io.FileNotFoundException: /home/user-name/dev/skeleton/application/target/application-1.0-SNAPSHOT.jar! (No such file or directory)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:220)
at java.util.zip.ZipFile.<init>(ZipFile.java:150)
at java.util.zip.ZipFile.<init>(ZipFile.java:164)
at org.drools.core.util.IoUtils.indexZipFile(IoUtils.java:124)
... 21 more
我用于构建项目的命令是:mvn clean package
并将其作为 jar 文件运行 (java -jar application/target/application-1.0-SNAPSHOT.jar
)。
引起我注意的一件事是文件路径(未找到的路径)末尾有一个感叹号(它不应该在这里)。我观察到的另一件事是,当我在 IntelijIdea ide 中运行该项目时,它会成功构建并正常运行。
这种错误的原因可能是什么?
最佳答案
我尝试了同样的方法并最终构建了一个 spring-boot-starter-drools为此,因为那里没有什么适合我的。我没有使用 XML-Configuration,因为最新的 Spring 配置仅与 Java 有关 - 我也建议您这样做。
建议:
使用此工作配置将 Drools 集成到您的 Spring Boot 项目中:
@Configuration
public class DroolsAutoConfiguration {
private static final String RULES_PATH = "rules/";
@Bean
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
}
@Bean
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
@Bean
public KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
}
spring 版本存在冲突,因为 Spring Boot 基于 Spring 4.x 而 kie-spring 依赖于 Spring 3.2 - 我得到了最愚蠢的异常,直到最后我排除了所有 3.2-dependecies在我的 pom.xml 中:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
关于java - Spring Boot 和 Drools 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650029/
Drools中物理包和包声明有什么用。 例如, 我有一个规则,物理包com.mycompany中的Myrule.drl 据我所知,drools 中的包声明不依赖于文件所在的实际物理包。 所以我可以将
我是 drools 的新手,并且熟悉使用 extends 关键字来继承规则。问题有没有办法继承多个规则?这类似于在 java 类上使用多个接口(interface)。这是我希望它如何工作的示例,但我在
我们使用 Drools 作为解决方案的一部分,在非常密集的处理应用程序中充当一种过滤器,可能在 500,000 多个工作内存对象上运行多达 100 条规则。 事实证明它非常慢。 其他人有在批处理类型处
我是 Drools 的新手,正在尝试让示例程序正常工作。drools 文档 http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert
我正在使用 drools-camel-server 5.4 Final 来执行从 jboss AS7 上的 guvnor 获取的规则,如下所示: 如何重新加载或重建知识库
我想将我的 .drl 文件预编译为 .class 文件,这样它们就不必在运行时编译。文档使它听起来像 kie-maven-plugin 这样做,但它没有为我生成任何东西。它编译规则文件但不输出任何内容
我正在尝试使用 Drools 向后链接来找出需要哪些事实才能将对象插入到工作内存中。在下面的示例中,我期望得到事实“go2”。 rule "ins a" when String( this =
是否可以通过规则名称触发 drool 文件中的规则?我的要求是,我的规则文件将包含所有规则的列表 (S)。但我有一个单独的配置,其中包含要触发的规则名称列表 (A)。注意 (A) 是 (S) 的子集。
我的项目使用 drools 专家手段 (DRL) 文件。在规则文件中,如果用户想删除和更新规则,应该怎么办? 规则文件: package com.sample; import com.sample.T
我被要求开始探索用于某些客户端演示的 Activiti 工具。 该演示还将包含与 Activiti 集成的 JBoss Drools。 我对这两种工具和业务流程世界都不熟悉,所以如果问题很愚蠢,请原谅
Ciao,我已经测试了几种方法,但我仍然无法在Drools Fusion中测试和验证事件过期机制,所以我正在寻找一些指导,好吗? 我已经阅读了手册,我对这个功能很感兴趣: In other words
我试图在 Drools 6.5 中创建两个独立的规则组,但我无法弄清楚规则流组和议程组策略的用例是什么。他们两个看起来很相似。 最佳答案 阅读文档... 2.6.4. RuleFowGroup 和 A
我是 Drools 新手。我正在创建规则,但出现编译时错误 "field is not visible'. 我尝试检查 Jboss 示例,其中使用方言“mvel”。它编译了。我听不懂方言。那么 dia
我正在尝试设置 kie 执行服务 (kie-server-services-6.2.0) 以供 kie-drools-wb-webapp-6.2.0 提供,当我尝试通过以下 webapp url执行服
我想实现规则引擎,其中如果仅执行一个条件,则它不会检查其他指定的条件。 rule "Print out lower-case tokens" when Token ( coveredText
我拥有所有必需的 JAR。尽管面临以下问题: java.lang.ClassCastException: org.drools.io.impl.ClassPathResource cannot be
我正在尝试 Redhat Drools,并且能够在 WildFly 环境中部署 Drools Workbench。我试图找出如何将规则公开为服务,但找不到关于如何做到这一点的文章。这是对 Drools
在使用 Drools 5.5 final 比较字符串值字段时,我遇到了一些令人费解的问题。 本质上,我试图找出是否有一对同名的人。 Person 类如下所示: public class Person
我正在寻找一个好的规则引擎。 我已经看到它存在两个好的项目:JBPM和Drools。 我不太了解两者之间的区别,也不知道要使用什么理想工具。 请您向我提供更多信息以及您在其他方面的经验,以及您认为最适
我们可以在 Excel 表格中编写 Drool 规则吗?规则可以用于简单的人类可读内容吗?如果我们可以,那该怎么做呢?请解释。 最佳答案 是的,你可以。阅读用户指南中名为“电子表格中的决策表”的部分如
我是一名优秀的程序员,十分优秀!