Search code examples
javaspringjunitdrools

Drools rule does't working in Spring Boot Controller but working in Junit Test


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

Solution

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