1. 程式人生 > >在專案中配置urule規則引擎

在專案中配置urule規則引擎


2.applicationContext.xm加入urule配置檔案
在專案spring配置檔案applicationContext.xml中,引入urule-console的spring配置檔案
    <!-- 2.匯入urule-console的spring配置檔案 -->
    <import resource="classpath:urule-console-context.xml"/>

3.新建configure.properties
Configure.properties
#用於指定當前知識庫存放目錄,必須存在
urule.repository
.dir=D:/repo #制定管理員使用者 urule.admin.username=susu

然後在專案spring配置檔案applicationContext.xml中,引入

<!-- 3.引入configure.properties -->
    <context:property-placeholder ignore-unresolvable="true" order="1" location="classpath:configure.properties"/>

4.web.xml配置urule的servlet
<!-- urule的servlet配置 -->
<servlet> <servlet-name>uruleServlet</servlet-name> <servlet-class>com.bstek.urule.console.servlet.URuleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>uruleServlet</servlet-name> <url-pattern
>
/urule/*</url-pattern> </servlet-mapping>

5.在urule控制檯建立動作庫用到
在urule控制檯建立動作庫,需要引入bean_id,因此需要建立一個,並在applicationContext.xml為這個建立一個bean_id;
MethodTest.java
public class MethodTest {
     @ExposeAction("列印Student")
        public void printUser(String  stuName){
            System.out.println("Hello "+stuName);
        }
}

配置檔案中,建立bean_id

<!-- 5.建立動作庫時,需要引入bean_id -->
    <bean id="methodTest" class="com.su.test.MethodTest"></bean>

6.具體建立變數庫、常量庫、引數庫、動作庫方式
參考:http://wiki.bsdn.org/pages/viewpage.action?pageId=75071567

7.以上配置完後,執行專案
執行專案,輸入http://localhost:8081/ProjectName/urule/frame,即可進入urule控制檯
這裡寫圖片描述

8.操作
在“專案列表”右鍵,建立新專案,然後在“”上建立變數庫、常量庫、引數庫、動作庫等,在“決策集”上建立嚮導式決策集、指令碼式決策集等。
9.模擬測試
在以上步驟完後,即可在“知識包”中進行模擬測試
這裡寫圖片描述
10.urule在程式碼中呼叫
建立一個InvokeTest.java
package com.su.test;

import com.bstek.urule.Utils;
import com.bstek.urule.runtime.KnowledgePackage;
import com.bstek.urule.runtime.KnowledgeSession;
import com.bstek.urule.runtime.KnowledgeSessionFactory;
import com.bstek.urule.runtime.service.KnowledgeService;
import com.su.domain.Student;
/**
 * @author su1573
 * @since 2018年8月29日
 */
public class InvokeTest {

    public  void doTest() throws Exception{
        //從Spring中獲取KnowledgeService介面例項
        KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
        //通過KnowledgeService介面獲取指定的資源包"projectName/知識包編碼"
        KnowledgePackage knowledgePackage=service.getKnowledge("SSMDemo/xiangdemo");
        //通過取到的KnowledgePackage物件建立KnowledgeSession物件
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        Student stu = new Student();

        stu.setStuAge(30);
        stu.setStuName("su");

        //將業務資料物件Employee插入到KnowledgeSession中
        session.insert(stu);

        //執行所有滿足條件的規則
        session.fireRules();
    }

}

再建立一個invoke.jsp,用於呼叫程式碼,進行規則測試

<%@page import="com.su.test.InvokeTest" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<%
    InvokeTest invoke = new InvokeTest();
    invoke.doTest();
%>
</body>
</html>

11.在程式碼中呼叫,並返回結果
public class InvokeTest {
    public  Student doTest() throws Exception{
        //從Spring中獲取KnowledgeService介面例項
        KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
        //通過KnowledgeService介面獲取指定的資源包"projectName/知識包編碼"
        KnowledgePackage knowledgePackage=service.getKnowledge("SSMDemo/xiangdemo");
        //通過取到的KnowledgePackage物件建立KnowledgeSession物件
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage); 

        Student stu = new Student();
        stu.setStuAge(50);

        //將業務資料物件Employee插入到KnowledgeSession中
        session.insert(stu);
        //執行所有滿足條件的規則
        session.fireRules();

        Student ss = (Student)session.getParameter("stu");
        System.out.println(ss.getStuName());
        return ss;  
    }
}

上面程式碼:

        Student ss = (Student)session.getParameter("stu");
        System.out.println(ss.getStuName());
        return ss;

就是資料經過規則驗證後,從KnowledgeSession 中取到的引數,其中”stu”,需要在引數庫中配置,如下:
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述


12.把知識包存到資料庫
需要在configure.properties配置檔案中新增兩個屬性
#資料來源bean的id
urule.repository.datasourcename=dataSource
#指定資料庫型別
urule.repository.databasetype=oracle
#上面兩個配置連線資料庫

#用於指定當前知識庫存放目錄
urule.repository.dir=D:/repo

一個是在spring配置檔案中資料庫bean的id,一個是資料庫型別(mysql、oracle、sql server、Db2)


13.把資料庫中使用者加入到urule控制檯

在URule當中,在外部沒有提供EnvironmentProvider介面實現的時候,它採用其內部提供的一個預設EnvironmentProvider介面實現,其原始碼如下:

EnvironmentProvider介面的預設實現類原始碼
package com.bstek.urule.console;
import java.util.ArrayList;
import java.util.List;
import com.bstek.urule.console.servlet.RequestContext;
/**
 * @author Jacky.gao
 * @since 2016年5月25日
 */
public class DefaultEnvironmentProvider implements EnvironmentProvider {
    @Override
    public User getLoginUser(RequestContext context) {
        DefaultUser user=new DefaultUser();
        user.setCompanyId("bstek");
        user.setUsername("admin");
        user.setAdmin(true);
        return user;
    }
    @Override
    public List<User> getUsers() {
        DefaultUser user1=new DefaultUser();
        user1.setCompanyId("bstek");
        user1.setUsername("user1");
        DefaultUser user2=new DefaultUser();
        user2.setCompanyId("bstek");
        user2.setUsername("user2");
        DefaultUser user3=new DefaultUser();
        user3.setCompanyId("bstek");
        user3.setUsername("user3");
        List<User> users=new ArrayList<User>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
        return users;
    }
}

在預設的實現類中,getLoginUser返回的是固定的使用者名稱為”admin”的使用者,並且它的isAdmin屬性為true,表示它是管理員,也就是說預設返回的登入使用者是名為admin的管理員,同時他所在的公司ID為”bstek”;在getUsers方法中固定返回user1、user2、user3三個使用者,他們的公司ID皆為”bstek”,與預設返回的登入使用者admin的公司ID相同,所以在上面介紹的許可權配置頁面中我們看到的是user1、user2、user3三個使用者。

關於User的公司ID
在URule當中,通過使用者的companyId(也就是公司ID)實現在一個URule的儲存庫中隔離不同公司使用者所建的規則專案。
某些時候,你可能只會搭建一個URule
Server,在這個Server中會有很多個使用者來建立專案、配置規則,但這些使用者有可能來自不同的公司,這個時候就需要有一種機制來隔離不同公司的人建立的專案,這裡就是通過使用者的companyId屬性實現。companyId為A的使用者建立的專案,companyId為B的人登入後是看不到的,反之亦然。EnvironmentProvider介面中返回的登入使用者如果isAdmin為true,也就是管理員,那麼它可以看到並操作其所在companyId下所有專案,而不需要做任何許可權配置,相反,進行許可權配置的工作也必須要由管理員來操作,否則會顯示“無許可權”的提示。
某個companyId下的管理員進行許可權配置的時候,他能配置的使用者也有與其companyId相同的普通使用者,同時可配置的專案也只有在當前companyId下建立的專案。

如果我們需要將業務系統中的使用者資訊引入到URule當中,那麼只需要實現一個新的EnvironmentProvider介面,並將其配置到spring的上下文中,讓其成為一個標準的bean即可。這樣系統啟動時會自動檢測到該介面實現的存在,從而用它來替換預設的EnvironmentProvider介面實現。

在專案中實現EnvironmentProvider介面

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.bstek.urule.console.DefaultUser;
import com.bstek.urule.console.EnvironmentProvider;
import com.bstek.urule.console.User;
import com.bstek.urule.console.servlet.RequestContext;
import com.su.service.UserService;
/**
 * @author su1573
 * @since 2018年9月7日
 */
public class TestEnvironmentProvider implements EnvironmentProvider {
    @Autowired
    private UserService userService;

    @Override
    public User getLoginUser(RequestContext rec) {
        DefaultUser user = new DefaultUser();
        user.setCompanyId("100");
        user.setUsername("su");
        user.setAdmin(true);

        return user;
    }

    @Override
    public List<User> getUsers() {
        List<com.su.domain.User> list = userService.findAllUser();
        List<User> luser = new ArrayList<User>();
        for(com.su.domain.User user : list){
            DefaultUser du = new DefaultUser();
            du.setCompanyId("100");
            du.setUsername(user.getLoginName());
            luser.add(du);
        }
        return luser;
    }
}

在spring 配置檔案中配置bean

<bean id="TestEn" class="com.su.test.TestEnvironmentProvider"></bean>

這樣就覆蓋了,預設的介面實現

當資料庫使用者出現後,可以對使用者進行配置許可權
這裡寫圖片描述


author:su1573