2017-04-11 613 views
1

我正在使用drools引擎構建警報系統。當條件滿足時,我們需要執行Spring Framework框架中對規則(RHS)操作實例化的@服務的方法如何在Drools規則中使用Spring服務?

通過Spring框架創建的Drools規則的動作(RHS)將使用什麼方法來獲取@service實例

我按照以下指示:

  1. 使用表單導入功能Rule1.drl)。此解決方案不起作用,因爲該類在drools中實例化並需要執行靜態方法。
  2. 使用全局會話變量(Rule2.drl)。此解決方案在「運行時」引發異常,表明它不是同一類類型。

有關如何使用它的任何想法?

由於

文件:Rule1.drl

package com.mycompany.alerts.Alert; 

import function com.mycompany.alerts.service.SecurityService.notifyAlert; 

rule "Activate Alert Type" 
salience 9000 
when 
    $alert: Alert(type == "TYPE1") 
then 
    System.out.println("Running action:" + drools.getRule().getName()); 
    $alert.setActive(Boolean.TRUE); 
    notifyAlert($alert.getStatus(),$alert.getSmsNumber());  
    System.out.println("End action:" + drools.getRule().getName()); 
end 

文件:Rule2.drl

package com.mycompany.alerts.Alert; 

global com.mycompany.alerts.service.SecurityService securityService; 

rule "Activate Alert Type 2" 
salience 9000 
when 
    $alert: Alert(type == "TYPE2") 
then 
    System.out.println("Running action:" + drools.getRule().getName()); 
    $alert.setActive(Boolean.TRUE); 
    securityService.notifyAlert($alert.getStatus(),$alert.getSmsNumber());  
    System.out.println("End action:" + drools.getRule().getName()); 
end 

文件:SecurityService.java

package com.mycompany.alerts.service; 

import com.mycompany.alerts.service.UserRepository; 

@Service 
@Transactional 
public class SecurityService { 

    private final Logger log = LoggerFactory.getLogger(SecurityService.class); 

    private final UserRepository userRepository; 

    public SecurityService(UserRepository userRepository) { 
     this.userRepository = userRepository; 
    } 

    public void notifyAlert(String status, String sms) { 
     System.out.println("Alert notify with:" + status + " sms:" + sms); 
    } 

} 

回答

0

可以使用kieRuntime的setGlobal功能:

kieRuntime.setGlobal("securityService", securityService); 

,那麼你可以聲明/在你的DRL文件中使用此變量:

global SecurityService securityService. 

PS: - KieRuntime對象可以是獲得爲:KieRuntime kieRuntime =(KieRuntime)kieSssion;