Spring Boot和Drools集成

我正在尝试使用Spring Boot" title="Spring Boot">Spring Boot 1.2.2.RELEASE运行Drools 6.2.0.Final。我按照文档中的说明配置了流口水。我的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有关-我也建议您这样做。

  1. 只需使用启动程序,如启动程序或示例项目中所述
  2. 通过以下工作配置将Drools集成到您的Spring Boot-Project中:

@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();

}

}

  1. spring版本之间存在冲突,因为Spring Boot基于Spring 4.x,而kie-spring依赖于Spring 3.2-我得到了最愚蠢的异常,直到最后,我在pom.xml中排除了所有3.2依赖项:

<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>

以上是 Spring Boot和Drools集成 的全部内容, 来源链接: utcz.com/qa/419182.html

回到顶部