Estoy trabajando con el motor de drools en la construcción de un sistema de alerta. necesitamos ejecutar un método de un @Service instanciado por Spring Framework en las acciones de la regla (RHS), cuando se cumplen las condiciones.
¿Cuál sería la forma de hacer que la instancia de @service creada por Spring Framework sea utilizada por la acción (RHS) de la regla Drools?
He seguido las siguientes indicaciones:
¿Alguna idea sobre cómo usarlo?
Como
Archivo: 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()); endArchivo: 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()); endArchivo: 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); } }Puede usar la función setGlobal de kieRuntime como:
kieRuntime.setGlobal("securityService", securityService);entonces puede declarar/usar esta variable en su archivo drl como:
global SecurityService securityService.PD: - El objeto KieRuntime se puede obtener como: KieRuntime kieRuntime = (KieRuntime) kieSssion;