在drools中有一个需求,想实现某个物料只能被某个公司的某个部门领取,物料的种类有上万种,部门几百个,公司几十个,请写出可以实现该需求的代码并尽可能地占用少的内存
时间: 2024-02-28 09:52:22 浏览: 51
Drools中文文档
对于这个需求,可以使用Drools中的Facts和规则来实现,而且可以优化内存占用。
首先,定义一个包含物料名称、公司和部门的Fact:
```java
public class Material {
private String name;
private String company;
private String department;
// getters and setters
}
```
然后,定义一个Map来存储具体的物料和对应的公司和部门:
```java
Map<String, Material> materialsMap = new HashMap<>();
materialsMap.put("Material A", new Material("Material A", "Company ABC", "Department XYZ"));
materialsMap.put("Material B", new Material("Material B", "Company DEF", "Department PQR"));
// ...
```
接下来,定义规则文件Materials.drl,规则文件中的规则将判断物料的领取是否符合要求:
```java
import com.example.Material
rule "Claim material"
when
$m : Material($name : name, $company : company, $department : department)
$allowed : Material(name == $name, company == $company, department == $department)
then
System.out.println("Material " + $name + " is allowed to be claimed by " + $department + " of " + $company);
end
```
在规则文件中,我们使用两个Material对象,一个是从Fact中读取的物料,另一个是从Map中读取的允许领取这种物料的公司和部门。如果两个对象的属性都相同,则表示领取是允许的。
最后,创建Drools引擎并应用规则:
```java
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
Resource resource = kieServices.getResources().newClassPathResource("Materials.drl");
kfs.write(resource);
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieSession kieSession = kieContainer.newKieSession();
for (Material material : materialsMap.values()) {
kieSession.insert(material);
}
Material materialToClaim = new Material("Material A", "Company ABC", "Department XYZ");
kieSession.insert(materialToClaim);
kieSession.fireAllRules();
```
在这个例子中,我们将所有的物料对象都插入到了Drools的Working Memory中,然后在运行时将需要领取的物料对象也插入到Working Memory中。Drools引擎会自动匹配规则并执行。
这种方法的好处是内存占用相对较低,因为只需要将具体的物料和允许领取这种物料的公司和部门存储在Map中,而不需要将所有可能的物料和对应的公司和部门都存储在内存中。
阅读全文