Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

271
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda