Как получить Факт создания BRL в Guvnor и запросить Drools Server

Я застрял с правилами BRL в Guvnor. Я пытаюсь выполнить правила из своего приложения, используя Drools Server (это решение, потому что в работе я могу использовать больше серверов и, возможно, повысить производительность. Не уверен в этом, так как это первый раз что в моей компании мы используем Drools)..

Так что в основном это правило. Учитывая, что объект Route устанавливает свойство "selectedOutboundJourney", которое я загрузил в guvnor в банку, я хотел бы получить другой объект с установленным свойством selectedReturnJourney.. (но возможно ли получить тот же объект??) На самом деле я получаю объект Route, где selectedReturnJourney имеет значение null.

Я не уверен, что использование BRL является хорошим решением, учитывая проблемы, с которыми я сталкиваюсь. Кажется, его легко использовать нетехническим людям, которые могут захотеть изменить правила или создать новые.

Тем не мение..

Это BRL, который я создал в Guvnor:

rule "Selected Return for Dover - Calais"
   dialect "mvel"
    when
        Route( selectedOutboundJourney == "DOCA" )
    then
        Route fact0 = new Route();
        fact0.setSelectedReturnJourney( "CADO" );
        insertLogical( fact0 );
        end

Это код, который я использую:

final List<Command> commands = new ArrayList<Command>();
final Command insertObjectCommand = CommandFactory.newInsert(input, RESULT, true, "default");
final Command getObjectCommand = CommandFactory.newGetObjects();
final Command fireAllRulesCommand = CommandFactory.newFireAllRules();
commands.add(insertObjectCommand);
commands.add(getObjectCommand);
commands.add(fireAllRulesCommand);

final ExecutionResults executionResults = droolsHttpClient.callDroolsServer(commands);
return executionResults.getValue(RESULT);

Класс DroolsHttpClient - это:

public ExecutionResults callDroolsServer(final List<Command> commands) throws  DroolsException
{
    PostMethod postMethod = null;
    try
    {
        final HttpClient httpClient = new HttpClient();
        final String droolsServerHost = Config.getString(PoferriesrulesengineConstants.DROOLS_SERVER_HOST, "");
        final int droolsServerPort = Config.getInt(PoferriesrulesengineConstants.DROOLS_SERVER_PORT, 0);
        httpClient.getHostConfiguration().setHost(droolsServerHost, droolsServerPort);

        final String droolsServerUrl = Config.getString(PoferriesrulesengineConstants.DROOLS_SERVER_URL, "");
        postMethod = new PostMethod(droolsServerUrl);

        final BatchExecutionCommand command = CommandFactory.newBatchExecution(commands, PoferriesrulesengineConstants.DROOLS_SESSION);
        final XStream xStreamMarshaller = BatchExecutionHelper.newXStreamMarshaller();
        final String xmlCommand = xStreamMarshaller.toXML(command);

        final StringRequestEntity request = new StringRequestEntity(xmlCommand, MediaType.TEXT_PLAIN_VALUE, CharEncoding.UTF_8);
        postMethod.setRequestEntity(request);

        httpClient.executeMethod(postMethod);
        if (postMethod.getStatusCode() != 200)
        {
            throw new RuntimeException("Drools Communication Error, code: " + postMethod.getStatusCode());
        }
        final String response = postMethod.getResponseBodyAsString();

        final ExecutionResults executionResults = (ExecutionResults) xStreamMarshaller.fromXML(response);
        return executionResults;
    }
    catch (final Exception e)
    {
        throw new DroolsException(e.getMessage());
    }
    finally
    {
        postMethod.releaseConnection();
    }
}

Если я использую DRL, как показано ниже, это слова совершенно без использования getObjectCommand:

rule "Selected Return Routes for Dover Calais"

    when
    r : Route(selectedOutboundJourney == "DOCA")
then
    r.setSelectedReturnJourney("CADO")

end

Кто-нибудь может мне помочь, пожалуйста?

1 ответ

Предполагая, что в начале сеанса знаний у вас есть только один факт, после выполнения следующего правила

rule "Selected Return for Dover - Calais"
dialect "mvel"
when
    Route( selectedOutboundJourney == "DOCA" )
then
    Route fact0 = new Route()
    fact0.setSelectedReturnJourney( "CADO" )
    insert( fact0 )
end

у тебя будет два Route факты в вашей сессии, так как вы только что вставили второй.

Route: selectedOutboundJourney = "DOCA", selectedReturnJourney=null
Route: selectedOutboundJourney = null, selectedReturnJourney="DACO"

Если вы хотите изменить исходный факт, используйте следующее правило:

rule "Selected Return Routes for Dover Calais"
when
   $r : Route(selectedOutboundJourney == "DOCA")
then
   modify ($r) {
     selectedReturnJourney = "CADO"
   }
end
Другие вопросы по тегам