On my first day to learn drools.I got this weird problem.
rule "Hello World" in drl cannot run in Controller,but working well in Junit test case. rule "Another rule" always run on both Controller and Junit test.
the code in controller and junit test are same totally.
Anyone who have idea is welcome. thanks .
Sample.drl:
package com.happylifeplat.checkin
import com.happylifeplat.checkin.managerorder.beans.RaBean1;
rule "Hello World"
when
$h : RaBean1( id == 1)
then
$h.setContent("from drl content");
System.out.println("-----Hello World rule called id == 1");
end
rule "Another rule"
when
then
System.out.println("-----Another rule called");
end
kmodule.xml:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
RaBean1.java:
package com.happylifeplat.checkin.managerorder.beans;
public class RaBean1 {
private int id;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
HelloController.java:
@RestController
@RequestMapping("/hello")
public class HelloController {
private static KieContainer kieContainer;
private KieSession sessionStatefull = null;
@RequestMapping(value = "/helloworld", method = RequestMethod.GET)
@ApiOperation(value = "hello")
public Result metadata() {
try {
if (kieContainer == null) {
kieContainer = KnowledgeSessionHelper.createRuleBase();
}
sessionStatefull = KnowledgeSessionHelper.getStatefulKnowledgeSessionWithCallback(kieContainer, "ksession-rules");
RaBean1 bean1 = new RaBean1();
bean1.setId(1);
bean1.setContent("default content");
sessionStatefull.insert(bean1);
sessionStatefull.fireAllRules();
return new Result(CommonCode.sussess, bean1.getContent());
} catch (Exception e) {
return new Result(CommonCode.fail, null);
}
}
}
HelloControllerTest.java:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ImportResource({"classpath:spring/applicationContext.xml"})
@IntegrationTest("server.port=0")
@WebAppConfiguration
public class HelloControllerTest {
private static final Logger log = LoggerFactory.getLogger(HelloControllerTest.class);
private MockMvc mockMvc;
private static KieContainer kieContainer;
private KieSession sessionStatefull = null;
@Before
public void setUp() throws Exception {
// mockMvc = MockMvcBuilders.standaloneSetup(managerOrderController).build();
}
@Test
public void helloTest() throws Exception {
if (kieContainer == null) {
kieContainer = KnowledgeSessionHelper.createRuleBase();
}
sessionStatefull = KnowledgeSessionHelper.getStatefulKnowledgeSessionWithCallback(kieContainer, "ksession-rules");
RaBean1 bean1 = new RaBean1();
bean1.setId(1);
bean1.setContent("default content");
sessionStatefull.insert(bean1);
sessionStatefull.fireAllRules();
System.out.println("rabean.getContent---->"+bean1.getContent());
}
}
Finally a friend helped me. It is because the "hot deployment". close it ,then problem solved.
It is in pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>