Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

275
Views
¿Cómo usar un servicio Spring en las reglas de Drools?

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:

  1. Usando la función de importación de formularios ( Rule1.drl ). Esta solución no funciona porque la clase se instancia en drools y requiere que se ejecuten métodos estáticos.
  2. Usando una variable de sesión global ( Rule2.drl ). Esta solución me arroja una excepción en "tiempo de ejecución" que indica que no es el mismo tipo de clase.

¿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()); end

Archivo: 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

Archivo: 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); } }
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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;

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!