Skip to content

快速开始

Ruler Project提供了Spring Boot开发场景下的Starter启动器,可直接使用ruler-spring-boot-starter依赖来进行开发。

引入依赖

xml
<dependency>
    <groupId>info.lostred.ruler</groupId>
    <artifactId>ruler-spring-boot-starter</artifactId>
    <version>{ruler.version}</version>
</dependency>

配置application.yaml

框架默认只会根据application.yaml配置单实例规则引擎,项目中需要使用到多类规则引擎时,需要自己配置规则引擎bean。

yaml
ruler:
  #业务类型
  business-type: person
  #规则引擎类型,默认为complete
  engine-type: complete
  #规则类包扫描路径,与注解@RuleScan定义的路径会取并集并一起扫描
  rule-default-scope: info.lostred.ruler.test.rule
  #领域模型类包扫描路径,与注解@DomainScan定义的路径会取并集并一起扫描
  domain-default-scope: info.lostred.ruler.test.domain

编写配置类 可选

使用注解初始化方式必须配置Configuration,单实例规则引擎不能满足项目时,可自定义规则引擎。

java
@Configuration
@RuleScan("info.lostred.ruler.test.rule")
@DomainScan("info.lostred.ruler.test.domain")
public class RulerConfig {
    //注册全局函数,spEl表达式可以使用#methodName调用全局函数
    @Bean
    public List<Method> globalFunctions() {
        return Arrays.asList(DateTimeUtils.class.getMethods());
    }
}

以上,info.lostred.ruler.test.domain为需要校验类的包名路径,下面是需要校验类的示例代码。

java
@Data
public class Person {
    private String certNo;
    private String name;
    private String gender;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;
    private Area area;
    private List<Contact> contacts;
}

@Data
public class Area {
    private String continent;
    private String country;
    private String province;
    private String city;
    private String district;
    private String town;
}

@Data
public class Contact {
    private String type;
    private String account;
    private String password;
    private Area area;
}

规则引擎依赖注入

以下是单元测试案例。

java
@SpringBootTest
class RulesEngineTest {
    static String businessType = "person";
    static Person person;
    @Autowired
    RulesEngineFactory rulesEngineFactory;
    @Autowired
    ObjectMapper objectMapper;

    String toJson(Object object) throws JsonProcessingException {
        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
    }

    void printResult(Object result, long startTime, long endTime) throws JsonProcessingException {
        System.out.println(toJson(result));
        System.out.println("执行时间: " + (endTime - startTime) + " ms");
    }

    @BeforeAll
    static void init() throws ParseException {
        person = new Person();
        person.setCertNo("12312");
        person.setGender("男");
        person.setAge(10);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = simpleDateFormat.parse("2019-01-01");
        person.setBirthday(parse);
        Area area = new Area();
        person.setArea(area);
        Contact contact1 = new Contact();
        contact1.setArea(area);
        contact1.setType("sdf");
        contact1.setPassword("1234");
        Contact contact2 = new Contact();
        contact2.setPassword("1234");
        person.setContacts(Arrays.asList(contact1, contact2));
    }

    @Test
    void executeTest() throws JsonProcessingException {
        RulesEngine rulesEngine = rulesEngineFactory.getEngine(businessType);
        long s = System.currentTimeMillis();
        EvaluationContext context = rulesEngine.createEvaluationContext(person);
        rulesEngine.execute(context);
        long e = System.currentTimeMillis();
        Result result = rulesEngine.getResult(context);
        printResult(result, s, e);
    }
}

这里注入的是RulesEngineFactory接口,使用该接口的getEngine()方法获取业务类型对应的规则引擎接口。当然也可以直接注入自己配置规则引擎的实现类。