Estoy trabajando en una aplicación que transforma un objeto de entrada en uno de dos objetos de salida en base a un conjunto de reglas Drools. El objeto de salida no se conoce hasta el tiempo de ejecución y se crea en la primera regla para ejecutar.
Esta es la regla que crea el objeto de salida y una regla de ejemplo de transformación:
rule "Initialization"
dialect "java"
salience 1000
no-loop true
when
t : Trade()
then
if(t.getTran().getInsType().equalsIgnoreCase("EEO") ||
t.getTran().getInsType().equalsIgnoreCase("EEF"))
{
insert(new Option());
}
else
{
insert(new Swap());
}
end
rule "Example Rule"
dialect "java"
when
t : Trade()
opt : Option()
then
opt.setCounterpartyName(t.getTran().getCParty());
end
Aquí está el código que llama a las reglas:
private void test(){
for(File xmlFile : getXmlFilesFromDirectory(XML_DIRECTORY))
{
Trade trade = (Trade)unmarshall(xmlFile, Trade.class);
KnowledgeBase kbase = readKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
List<Command> commands = new ArrayList<Command>();
commands.add(CommandFactory.newInsert(trade, "trade"));
commands.add(CommandFactory.newFireAllRules());
ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(commands));
logger.close();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception
{
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("security-transformation.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0)
{
for (KnowledgeBuilderError error: errors)
{
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
Problema:
Cuando ejecuto las reglas, no recibo el objeto de salida en mis datos devueltos. Recibo el objeto comercial nuevamente pero no recupero la opción o el objeto Swap dependiendo de cuál se haya agregado a la memoria operativa según la primera regla.
Pregunta:
¿Cómo agrego hechos a la memoria de trabajo en tiempo de ejecución en el drl y recuperarlos en los resultados de la ejecución de una sesión sin estado?
EDITAR: ¿Debo utilizar una consulta de drools?
FaVoR suugest sobre esta cuestión. Gracias. http://stackoverflow.com/questions/20158726/dialect-error-message-drool – Kumar